Specify the tissue of interest, run the boilerplate code which sets up the functions and environment, load the tissue object.

tissue_of_interest = "Heart"
library(here)
source(here("00_data_ingest", "02_tissue_analysis_rmd", "boilerplate.R"))
tiss=load_tissue_facs(tissue_of_interest)

Visualize top genes in principal components

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = tiss)

Choose the number of principal components to use.

# Set number of principal components. 
n.pcs = 10

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale…higher resolution will give more clusters, lower resolution will give fewer.

For the top-level clustering, aim to under-cluster instead of over-cluster. It will be easy to subset groups and further analyze them below.

# Set resolution 
res.used <- 0.5
tiss <- FindClusters(object = tiss, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)

To visualize

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
tiss <- RunTSNE(object = tiss, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
# note that you can set do.label=T to help label individual clusters
TSNEPlot(object = tiss, do.label = T)

Check expression of genes of interset.

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest.

How big are the clusters?

table(tiss@ident)

  0   1   2   3   4   5   6   7   8   9  10  11 
944 706 565 469 426 365 247 220 165 133  97  28 

Which markers identify a specific cluster?

clust.markers <- FindMarkers(object = tiss, ident.1 = 0, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 42s      
   |++                                                | 2 % ~01m 40s      
   |++                                                | 3 % ~01m 40s      
   |+++                                               | 4 % ~01m 38s      
   |+++                                               | 5 % ~01m 37s      
   |++++                                              | 6 % ~01m 36s      
   |++++                                              | 7 % ~01m 36s      
   |+++++                                             | 8 % ~01m 34s      
   |+++++                                             | 9 % ~01m 33s      
   |++++++                                            | 10% ~01m 32s      
   |++++++                                            | 11% ~01m 32s      
   |+++++++                                           | 12% ~01m 31s      
   |+++++++                                           | 13% ~01m 30s      
   |++++++++                                          | 14% ~01m 29s      
   |++++++++                                          | 15% ~01m 28s      
   |+++++++++                                         | 16% ~01m 27s      
   |+++++++++                                         | 18% ~01m 26s      
   |++++++++++                                        | 19% ~01m 24s      
   |++++++++++                                        | 20% ~01m 23s      
   |+++++++++++                                       | 21% ~01m 22s      
   |+++++++++++                                       | 22% ~01m 21s      
   |++++++++++++                                      | 23% ~01m 20s      
   |++++++++++++                                      | 24% ~01m 19s      
   |+++++++++++++                                     | 25% ~01m 18s      
   |+++++++++++++                                     | 26% ~01m 17s      
   |++++++++++++++                                    | 27% ~01m 16s      
   |++++++++++++++                                    | 28% ~01m 15s      
   |+++++++++++++++                                   | 29% ~01m 14s      
   |+++++++++++++++                                   | 30% ~01m 12s      
   |++++++++++++++++                                  | 31% ~01m 11s      
   |++++++++++++++++                                  | 32% ~01m 10s      
   |+++++++++++++++++                                 | 33% ~01m 09s      
   |++++++++++++++++++                                | 34% ~01m 08s      
   |++++++++++++++++++                                | 35% ~01m 07s      
   |+++++++++++++++++++                               | 36% ~01m 06s      
   |+++++++++++++++++++                               | 37% ~01m 05s      
   |++++++++++++++++++++                              | 38% ~01m 04s      
   |++++++++++++++++++++                              | 39% ~01m 03s      
   |+++++++++++++++++++++                             | 40% ~01m 02s      
   |+++++++++++++++++++++                             | 41% ~01m 01s      
   |++++++++++++++++++++++                            | 42% ~60s          
   |++++++++++++++++++++++                            | 43% ~59s          
   |+++++++++++++++++++++++                           | 44% ~58s          
   |+++++++++++++++++++++++                           | 45% ~57s          
   |++++++++++++++++++++++++                          | 46% ~55s          
   |++++++++++++++++++++++++                          | 47% ~54s          
   |+++++++++++++++++++++++++                         | 48% ~53s          
   |+++++++++++++++++++++++++                         | 49% ~52s          
   |++++++++++++++++++++++++++                        | 51% ~51s          
   |++++++++++++++++++++++++++                        | 52% ~50s          
   |+++++++++++++++++++++++++++                       | 53% ~49s          
   |+++++++++++++++++++++++++++                       | 54% ~48s          
   |++++++++++++++++++++++++++++                      | 55% ~47s          
   |++++++++++++++++++++++++++++                      | 56% ~46s          
   |+++++++++++++++++++++++++++++                     | 57% ~45s          
   |+++++++++++++++++++++++++++++                     | 58% ~44s          
   |++++++++++++++++++++++++++++++                    | 59% ~43s          
   |++++++++++++++++++++++++++++++                    | 60% ~42s          
   |+++++++++++++++++++++++++++++++                   | 61% ~41s          
   |+++++++++++++++++++++++++++++++                   | 62% ~40s          
   |++++++++++++++++++++++++++++++++                  | 63% ~38s          
   |++++++++++++++++++++++++++++++++                  | 64% ~37s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~36s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~35s          
   |++++++++++++++++++++++++++++++++++                | 67% ~34s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~33s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~32s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~31s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~29s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~27s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~26s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~25s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~23s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~22s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 43s
print(x = head(x= clust.markers, n = 10))

You can also compute all markers for all clusters at once. This may take some time.

tiss.markers <- FindAllMarkers(object = tiss, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 10s      
   |++                                                | 2 % ~01m 09s      
   |++                                                | 3 % ~01m 08s      
   |+++                                               | 4 % ~01m 07s      
   |+++                                               | 5 % ~01m 06s      
   |++++                                              | 6 % ~01m 05s      
   |++++                                              | 7 % ~01m 04s      
   |+++++                                             | 8 % ~01m 04s      
   |+++++                                             | 9 % ~01m 03s      
   |++++++                                            | 10% ~01m 02s      
   |++++++                                            | 11% ~01m 02s      
   |+++++++                                           | 12% ~01m 01s      
   |+++++++                                           | 14% ~01m 00s      
   |++++++++                                          | 15% ~59s          
   |++++++++                                          | 16% ~59s          
   |+++++++++                                         | 17% ~58s          
   |+++++++++                                         | 18% ~57s          
   |++++++++++                                        | 19% ~56s          
   |++++++++++                                        | 20% ~56s          
   |+++++++++++                                       | 21% ~55s          
   |+++++++++++                                       | 22% ~54s          
   |++++++++++++                                      | 23% ~54s          
   |++++++++++++                                      | 24% ~53s          
   |+++++++++++++                                     | 25% ~52s          
   |++++++++++++++                                    | 26% ~51s          
   |++++++++++++++                                    | 27% ~51s          
   |+++++++++++++++                                   | 28% ~50s          
   |+++++++++++++++                                   | 29% ~49s          
   |++++++++++++++++                                  | 30% ~49s          
   |++++++++++++++++                                  | 31% ~48s          
   |+++++++++++++++++                                 | 32% ~47s          
   |+++++++++++++++++                                 | 33% ~46s          
   |++++++++++++++++++                                | 34% ~46s          
   |++++++++++++++++++                                | 35% ~45s          
   |+++++++++++++++++++                               | 36% ~44s          
   |+++++++++++++++++++                               | 38% ~43s          
   |++++++++++++++++++++                              | 39% ~43s          
   |++++++++++++++++++++                              | 40% ~42s          
   |+++++++++++++++++++++                             | 41% ~41s          
   |+++++++++++++++++++++                             | 42% ~41s          
   |++++++++++++++++++++++                            | 43% ~40s          
   |++++++++++++++++++++++                            | 44% ~39s          
   |+++++++++++++++++++++++                           | 45% ~38s          
   |+++++++++++++++++++++++                           | 46% ~38s          
   |++++++++++++++++++++++++                          | 47% ~37s          
   |++++++++++++++++++++++++                          | 48% ~36s          
   |+++++++++++++++++++++++++                         | 49% ~35s          
   |+++++++++++++++++++++++++                         | 50% ~35s          
   |++++++++++++++++++++++++++                        | 51% ~34s          
   |+++++++++++++++++++++++++++                       | 52% ~33s          
   |+++++++++++++++++++++++++++                       | 53% ~33s          
   |++++++++++++++++++++++++++++                      | 54% ~32s          
   |++++++++++++++++++++++++++++                      | 55% ~31s          
   |+++++++++++++++++++++++++++++                     | 56% ~30s          
   |+++++++++++++++++++++++++++++                     | 57% ~30s          
   |++++++++++++++++++++++++++++++                    | 58% ~29s          
   |++++++++++++++++++++++++++++++                    | 59% ~28s          
   |+++++++++++++++++++++++++++++++                   | 60% ~28s          
   |+++++++++++++++++++++++++++++++                   | 61% ~27s          
   |++++++++++++++++++++++++++++++++                  | 62% ~26s          
   |++++++++++++++++++++++++++++++++                  | 64% ~25s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~25s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~24s          
   |++++++++++++++++++++++++++++++++++                | 67% ~23s          
   |++++++++++++++++++++++++++++++++++                | 68% ~22s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~22s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~21s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~20s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~17s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~15s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 09s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 04s      
   |++                                                | 2 % ~02m 14s      
   |++                                                | 3 % ~02m 10s      
   |+++                                               | 4 % ~02m 06s      
   |+++                                               | 5 % ~02m 04s      
   |++++                                              | 6 % ~02m 02s      
   |++++                                              | 7 % ~01m 60s      
   |+++++                                             | 8 % ~02m 00s      
   |+++++                                             | 9 % ~01m 60s      
   |++++++                                            | 10% ~01m 58s      
   |++++++                                            | 11% ~01m 56s      
   |+++++++                                           | 12% ~01m 55s      
   |+++++++                                           | 13% ~01m 54s      
   |++++++++                                          | 14% ~01m 53s      
   |++++++++                                          | 15% ~01m 52s      
   |+++++++++                                         | 16% ~01m 51s      
   |+++++++++                                         | 18% ~01m 49s      
   |++++++++++                                        | 19% ~01m 48s      
   |++++++++++                                        | 20% ~01m 47s      
   |+++++++++++                                       | 21% ~01m 46s      
   |+++++++++++                                       | 22% ~01m 45s      
   |++++++++++++                                      | 23% ~01m 44s      
   |++++++++++++                                      | 24% ~01m 42s      
   |+++++++++++++                                     | 25% ~01m 41s      
   |+++++++++++++                                     | 26% ~01m 40s      
   |++++++++++++++                                    | 27% ~01m 39s      
   |++++++++++++++                                    | 28% ~01m 38s      
   |+++++++++++++++                                   | 29% ~01m 37s      
   |+++++++++++++++                                   | 30% ~01m 36s      
   |++++++++++++++++                                  | 31% ~01m 36s      
   |++++++++++++++++                                  | 32% ~01m 35s      
   |+++++++++++++++++                                 | 33% ~01m 33s      
   |++++++++++++++++++                                | 34% ~01m 31s      
   |++++++++++++++++++                                | 35% ~01m 30s      
   |+++++++++++++++++++                               | 36% ~01m 28s      
   |+++++++++++++++++++                               | 37% ~01m 26s      
   |++++++++++++++++++++                              | 38% ~01m 25s      
   |++++++++++++++++++++                              | 39% ~01m 23s      
   |+++++++++++++++++++++                             | 40% ~01m 22s      
   |+++++++++++++++++++++                             | 41% ~01m 20s      
   |++++++++++++++++++++++                            | 42% ~01m 19s      
   |++++++++++++++++++++++                            | 43% ~01m 18s      
   |+++++++++++++++++++++++                           | 44% ~01m 16s      
   |+++++++++++++++++++++++                           | 45% ~01m 15s      
   |++++++++++++++++++++++++                          | 46% ~01m 13s      
   |++++++++++++++++++++++++                          | 47% ~01m 12s      
   |+++++++++++++++++++++++++                         | 48% ~01m 10s      
   |+++++++++++++++++++++++++                         | 49% ~01m 09s      
   |++++++++++++++++++++++++++                        | 51% ~01m 08s      
   |++++++++++++++++++++++++++                        | 52% ~01m 06s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 05s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 03s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 02s      
   |++++++++++++++++++++++++++++                      | 56% ~01m 01s      
   |+++++++++++++++++++++++++++++                     | 57% ~59s          
   |+++++++++++++++++++++++++++++                     | 58% ~58s          
   |++++++++++++++++++++++++++++++                    | 59% ~56s          
   |++++++++++++++++++++++++++++++                    | 60% ~55s          
   |+++++++++++++++++++++++++++++++                   | 61% ~53s          
   |+++++++++++++++++++++++++++++++                   | 62% ~52s          
   |++++++++++++++++++++++++++++++++                  | 63% ~51s          
   |++++++++++++++++++++++++++++++++                  | 64% ~49s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~48s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~46s          
   |++++++++++++++++++++++++++++++++++                | 67% ~45s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~44s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~42s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~41s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~39s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~38s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~37s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~35s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~34s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~32s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~31s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~30s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~23s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 15s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 46s      
   |++                                                | 2 % ~01m 47s      
   |++                                                | 3 % ~01m 47s      
   |+++                                               | 4 % ~01m 47s      
   |+++                                               | 5 % ~01m 46s      
   |++++                                              | 6 % ~01m 45s      
   |++++                                              | 7 % ~01m 44s      
   |+++++                                             | 8 % ~01m 42s      
   |+++++                                             | 9 % ~01m 41s      
   |++++++                                            | 10% ~01m 40s      
   |++++++                                            | 11% ~01m 38s      
   |+++++++                                           | 12% ~01m 37s      
   |+++++++                                           | 13% ~01m 36s      
   |++++++++                                          | 14% ~01m 35s      
   |++++++++                                          | 15% ~01m 34s      
   |+++++++++                                         | 16% ~01m 36s      
   |+++++++++                                         | 18% ~01m 34s      
   |++++++++++                                        | 19% ~01m 33s      
   |++++++++++                                        | 20% ~01m 32s      
   |+++++++++++                                       | 21% ~01m 31s      
   |+++++++++++                                       | 22% ~01m 30s      
   |++++++++++++                                      | 23% ~01m 28s      
   |++++++++++++                                      | 24% ~01m 27s      
   |+++++++++++++                                     | 25% ~01m 25s      
   |+++++++++++++                                     | 26% ~01m 24s      
   |++++++++++++++                                    | 27% ~01m 22s      
   |++++++++++++++                                    | 28% ~01m 21s      
   |+++++++++++++++                                   | 29% ~01m 19s      
   |+++++++++++++++                                   | 30% ~01m 18s      
   |++++++++++++++++                                  | 31% ~01m 17s      
   |++++++++++++++++                                  | 32% ~01m 16s      
   |+++++++++++++++++                                 | 33% ~01m 15s      
   |++++++++++++++++++                                | 34% ~01m 14s      
   |++++++++++++++++++                                | 35% ~01m 13s      
   |+++++++++++++++++++                               | 36% ~01m 11s      
   |+++++++++++++++++++                               | 37% ~01m 10s      
   |++++++++++++++++++++                              | 38% ~01m 09s      
   |++++++++++++++++++++                              | 39% ~01m 07s      
   |+++++++++++++++++++++                             | 40% ~01m 06s      
   |+++++++++++++++++++++                             | 41% ~01m 05s      
   |++++++++++++++++++++++                            | 42% ~01m 04s      
   |++++++++++++++++++++++                            | 43% ~01m 03s      
   |+++++++++++++++++++++++                           | 44% ~01m 02s      
   |+++++++++++++++++++++++                           | 45% ~01m 00s      
   |++++++++++++++++++++++++                          | 46% ~59s          
   |++++++++++++++++++++++++                          | 47% ~58s          
   |+++++++++++++++++++++++++                         | 48% ~57s          
   |+++++++++++++++++++++++++                         | 49% ~56s          
   |++++++++++++++++++++++++++                        | 51% ~55s          
   |++++++++++++++++++++++++++                        | 52% ~53s          
   |+++++++++++++++++++++++++++                       | 53% ~53s          
   |+++++++++++++++++++++++++++                       | 54% ~52s          
   |++++++++++++++++++++++++++++                      | 55% ~51s          
   |++++++++++++++++++++++++++++                      | 56% ~50s          
   |+++++++++++++++++++++++++++++                     | 57% ~48s          
   |+++++++++++++++++++++++++++++                     | 58% ~47s          
   |++++++++++++++++++++++++++++++                    | 59% ~46s          
   |++++++++++++++++++++++++++++++                    | 60% ~45s          
   |+++++++++++++++++++++++++++++++                   | 61% ~44s          
   |+++++++++++++++++++++++++++++++                   | 62% ~43s          
   |++++++++++++++++++++++++++++++++                  | 63% ~42s          
   |++++++++++++++++++++++++++++++++                  | 64% ~41s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~39s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~38s          
   |++++++++++++++++++++++++++++++++++                | 67% ~37s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~36s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~35s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~33s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~32s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~31s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~30s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~29s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~28s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~27s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~26s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~24s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~23s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 53s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 37s      
   |++                                                | 2 % ~01m 34s      
   |++                                                | 3 % ~01m 30s      
   |+++                                               | 4 % ~01m 29s      
   |+++                                               | 5 % ~01m 27s      
   |++++                                              | 6 % ~01m 25s      
   |++++                                              | 7 % ~01m 24s      
   |+++++                                             | 8 % ~01m 23s      
   |+++++                                             | 9 % ~01m 24s      
   |++++++                                            | 10% ~01m 23s      
   |++++++                                            | 11% ~01m 22s      
   |+++++++                                           | 12% ~01m 21s      
   |+++++++                                           | 14% ~01m 19s      
   |++++++++                                          | 15% ~01m 18s      
   |++++++++                                          | 16% ~01m 17s      
   |+++++++++                                         | 17% ~01m 16s      
   |+++++++++                                         | 18% ~01m 15s      
   |++++++++++                                        | 19% ~01m 13s      
   |++++++++++                                        | 20% ~01m 12s      
   |+++++++++++                                       | 21% ~01m 11s      
   |+++++++++++                                       | 22% ~01m 10s      
   |++++++++++++                                      | 23% ~01m 09s      
   |++++++++++++                                      | 24% ~01m 08s      
   |+++++++++++++                                     | 25% ~01m 07s      
   |++++++++++++++                                    | 26% ~01m 06s      
   |++++++++++++++                                    | 27% ~01m 05s      
   |+++++++++++++++                                   | 28% ~01m 04s      
   |+++++++++++++++                                   | 29% ~01m 03s      
   |++++++++++++++++                                  | 30% ~01m 02s      
   |++++++++++++++++                                  | 31% ~01m 01s      
   |+++++++++++++++++                                 | 32% ~01m 00s      
   |+++++++++++++++++                                 | 33% ~59s          
   |++++++++++++++++++                                | 34% ~58s          
   |++++++++++++++++++                                | 35% ~57s          
   |+++++++++++++++++++                               | 36% ~56s          
   |+++++++++++++++++++                               | 38% ~56s          
   |++++++++++++++++++++                              | 39% ~55s          
   |++++++++++++++++++++                              | 40% ~54s          
   |+++++++++++++++++++++                             | 41% ~53s          
   |+++++++++++++++++++++                             | 42% ~52s          
   |++++++++++++++++++++++                            | 43% ~51s          
   |++++++++++++++++++++++                            | 44% ~51s          
   |+++++++++++++++++++++++                           | 45% ~50s          
   |+++++++++++++++++++++++                           | 46% ~49s          
   |++++++++++++++++++++++++                          | 47% ~48s          
   |++++++++++++++++++++++++                          | 48% ~48s          
   |+++++++++++++++++++++++++                         | 49% ~47s          
   |+++++++++++++++++++++++++                         | 50% ~46s          
   |++++++++++++++++++++++++++                        | 51% ~46s          
   |+++++++++++++++++++++++++++                       | 52% ~45s          
   |+++++++++++++++++++++++++++                       | 53% ~44s          
   |++++++++++++++++++++++++++++                      | 54% ~43s          
   |++++++++++++++++++++++++++++                      | 55% ~42s          
   |+++++++++++++++++++++++++++++                     | 56% ~41s          
   |+++++++++++++++++++++++++++++                     | 57% ~40s          
   |++++++++++++++++++++++++++++++                    | 58% ~39s          
   |++++++++++++++++++++++++++++++                    | 59% ~38s          
   |+++++++++++++++++++++++++++++++                   | 60% ~37s          
   |+++++++++++++++++++++++++++++++                   | 61% ~37s          
   |++++++++++++++++++++++++++++++++                  | 62% ~36s          
   |++++++++++++++++++++++++++++++++                  | 64% ~35s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~34s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~33s          
   |++++++++++++++++++++++++++++++++++                | 67% ~32s          
   |++++++++++++++++++++++++++++++++++                | 68% ~31s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~30s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~29s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~28s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~27s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~26s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~25s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~24s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~23s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~22s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~21s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 34s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 11s      
   |++                                                | 2 % ~02m 05s      
   |++                                                | 3 % ~02m 02s      
   |+++                                               | 4 % ~01m 60s      
   |+++                                               | 5 % ~02m 05s      
   |++++                                              | 6 % ~02m 02s      
   |++++                                              | 7 % ~01m 59s      
   |+++++                                             | 8 % ~01m 57s      
   |+++++                                             | 9 % ~01m 55s      
   |++++++                                            | 10% ~01m 54s      
   |++++++                                            | 11% ~01m 52s      
   |+++++++                                           | 12% ~01m 50s      
   |+++++++                                           | 13% ~01m 49s      
   |++++++++                                          | 14% ~01m 47s      
   |++++++++                                          | 15% ~01m 46s      
   |+++++++++                                         | 16% ~01m 45s      
   |+++++++++                                         | 17% ~01m 43s      
   |++++++++++                                        | 18% ~01m 42s      
   |++++++++++                                        | 19% ~01m 40s      
   |+++++++++++                                       | 20% ~01m 39s      
   |+++++++++++                                       | 21% ~01m 38s      
   |++++++++++++                                      | 22% ~01m 36s      
   |++++++++++++                                      | 23% ~01m 35s      
   |+++++++++++++                                     | 24% ~01m 34s      
   |+++++++++++++                                     | 25% ~01m 33s      
   |++++++++++++++                                    | 26% ~01m 32s      
   |++++++++++++++                                    | 27% ~01m 30s      
   |+++++++++++++++                                   | 28% ~01m 29s      
   |+++++++++++++++                                   | 29% ~01m 28s      
   |++++++++++++++++                                  | 30% ~01m 26s      
   |++++++++++++++++                                  | 31% ~01m 25s      
   |+++++++++++++++++                                 | 32% ~01m 24s      
   |+++++++++++++++++                                 | 33% ~01m 22s      
   |++++++++++++++++++                                | 34% ~01m 21s      
   |++++++++++++++++++                                | 35% ~01m 20s      
   |+++++++++++++++++++                               | 36% ~01m 19s      
   |+++++++++++++++++++                               | 37% ~01m 17s      
   |++++++++++++++++++++                              | 38% ~01m 16s      
   |++++++++++++++++++++                              | 39% ~01m 15s      
   |+++++++++++++++++++++                             | 40% ~01m 14s      
   |+++++++++++++++++++++                             | 41% ~01m 12s      
   |++++++++++++++++++++++                            | 42% ~01m 11s      
   |++++++++++++++++++++++                            | 43% ~01m 10s      
   |+++++++++++++++++++++++                           | 44% ~01m 09s      
   |+++++++++++++++++++++++                           | 45% ~01m 07s      
   |++++++++++++++++++++++++                          | 46% ~01m 06s      
   |++++++++++++++++++++++++                          | 47% ~01m 05s      
   |+++++++++++++++++++++++++                         | 48% ~01m 04s      
   |+++++++++++++++++++++++++                         | 49% ~01m 04s      
   |++++++++++++++++++++++++++                        | 51% ~01m 02s      
   |++++++++++++++++++++++++++                        | 52% ~01m 01s      
   |+++++++++++++++++++++++++++                       | 53% ~60s          
   |+++++++++++++++++++++++++++                       | 54% ~59s          
   |++++++++++++++++++++++++++++                      | 55% ~57s          
   |++++++++++++++++++++++++++++                      | 56% ~56s          
   |+++++++++++++++++++++++++++++                     | 57% ~55s          
   |+++++++++++++++++++++++++++++                     | 58% ~54s          
   |++++++++++++++++++++++++++++++                    | 59% ~52s          
   |++++++++++++++++++++++++++++++                    | 60% ~51s          
   |+++++++++++++++++++++++++++++++                   | 61% ~50s          
   |+++++++++++++++++++++++++++++++                   | 62% ~49s          
   |++++++++++++++++++++++++++++++++                  | 63% ~47s          
   |++++++++++++++++++++++++++++++++                  | 64% ~46s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~45s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~43s          
   |++++++++++++++++++++++++++++++++++                | 67% ~42s          
   |++++++++++++++++++++++++++++++++++                | 68% ~41s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~40s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~38s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~37s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~36s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~35s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~33s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~32s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~31s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~29s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~28s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~27s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~23s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 07s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 60s      
   |++                                                | 2 % ~01m 56s      
   |++                                                | 3 % ~01m 54s      
   |+++                                               | 4 % ~01m 53s      
   |+++                                               | 5 % ~01m 54s      
   |++++                                              | 6 % ~01m 52s      
   |++++                                              | 7 % ~01m 51s      
   |+++++                                             | 8 % ~01m 49s      
   |+++++                                             | 9 % ~01m 47s      
   |++++++                                            | 10% ~01m 46s      
   |++++++                                            | 11% ~01m 45s      
   |+++++++                                           | 12% ~01m 43s      
   |+++++++                                           | 13% ~01m 42s      
   |++++++++                                          | 14% ~01m 41s      
   |++++++++                                          | 15% ~01m 40s      
   |+++++++++                                         | 16% ~01m 38s      
   |+++++++++                                         | 17% ~01m 37s      
   |++++++++++                                        | 18% ~01m 36s      
   |++++++++++                                        | 19% ~01m 35s      
   |+++++++++++                                       | 20% ~01m 33s      
   |+++++++++++                                       | 21% ~01m 32s      
   |++++++++++++                                      | 22% ~01m 31s      
   |++++++++++++                                      | 23% ~01m 30s      
   |+++++++++++++                                     | 24% ~01m 29s      
   |+++++++++++++                                     | 26% ~01m 27s      
   |++++++++++++++                                    | 27% ~01m 26s      
   |++++++++++++++                                    | 28% ~01m 25s      
   |+++++++++++++++                                   | 29% ~01m 24s      
   |+++++++++++++++                                   | 30% ~01m 23s      
   |++++++++++++++++                                  | 31% ~01m 22s      
   |++++++++++++++++                                  | 32% ~01m 20s      
   |+++++++++++++++++                                 | 33% ~01m 19s      
   |+++++++++++++++++                                 | 34% ~01m 18s      
   |++++++++++++++++++                                | 35% ~01m 17s      
   |++++++++++++++++++                                | 36% ~01m 16s      
   |+++++++++++++++++++                               | 37% ~01m 14s      
   |+++++++++++++++++++                               | 38% ~01m 13s      
   |++++++++++++++++++++                              | 39% ~01m 12s      
   |++++++++++++++++++++                              | 40% ~01m 11s      
   |+++++++++++++++++++++                             | 41% ~01m 10s      
   |+++++++++++++++++++++                             | 42% ~01m 09s      
   |++++++++++++++++++++++                            | 43% ~01m 08s      
   |++++++++++++++++++++++                            | 44% ~01m 06s      
   |+++++++++++++++++++++++                           | 45% ~01m 05s      
   |+++++++++++++++++++++++                           | 46% ~01m 04s      
   |++++++++++++++++++++++++                          | 47% ~01m 03s      
   |++++++++++++++++++++++++                          | 48% ~01m 02s      
   |+++++++++++++++++++++++++                         | 49% ~01m 01s      
   |+++++++++++++++++++++++++                         | 50% ~01m 00s      
   |++++++++++++++++++++++++++                        | 51% ~59s          
   |+++++++++++++++++++++++++++                       | 52% ~58s          
   |+++++++++++++++++++++++++++                       | 53% ~57s          
   |++++++++++++++++++++++++++++                      | 54% ~56s          
   |++++++++++++++++++++++++++++                      | 55% ~55s          
   |+++++++++++++++++++++++++++++                     | 56% ~53s          
   |+++++++++++++++++++++++++++++                     | 57% ~52s          
   |++++++++++++++++++++++++++++++                    | 58% ~51s          
   |++++++++++++++++++++++++++++++                    | 59% ~50s          
   |+++++++++++++++++++++++++++++++                   | 60% ~48s          
   |+++++++++++++++++++++++++++++++                   | 61% ~47s          
   |++++++++++++++++++++++++++++++++                  | 62% ~46s          
   |++++++++++++++++++++++++++++++++                  | 63% ~45s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~43s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~42s          
   |++++++++++++++++++++++++++++++++++                | 66% ~41s          
   |++++++++++++++++++++++++++++++++++                | 67% ~40s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~38s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~37s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~36s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~35s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~34s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~32s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~31s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~30s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~29s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~27s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~26s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 01s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 05s      
   |+                                                 | 2 % ~02m 06s      
   |++                                                | 3 % ~02m 04s      
   |++                                                | 4 % ~02m 05s      
   |+++                                               | 5 % ~02m 02s      
   |+++                                               | 6 % ~01m 59s      
   |++++                                              | 7 % ~01m 58s      
   |++++                                              | 8 % ~01m 56s      
   |+++++                                             | 9 % ~01m 54s      
   |+++++                                             | 10% ~01m 53s      
   |++++++                                            | 11% ~01m 52s      
   |++++++                                            | 12% ~01m 52s      
   |+++++++                                           | 13% ~01m 51s      
   |+++++++                                           | 14% ~01m 49s      
   |++++++++                                          | 15% ~01m 47s      
   |++++++++                                          | 16% ~01m 46s      
   |+++++++++                                         | 17% ~01m 45s      
   |+++++++++                                         | 18% ~01m 44s      
   |++++++++++                                        | 19% ~01m 43s      
   |++++++++++                                        | 20% ~01m 42s      
   |+++++++++++                                       | 21% ~01m 41s      
   |+++++++++++                                       | 22% ~01m 40s      
   |++++++++++++                                      | 23% ~01m 38s      
   |++++++++++++                                      | 24% ~01m 37s      
   |+++++++++++++                                     | 25% ~01m 36s      
   |+++++++++++++                                     | 26% ~01m 35s      
   |++++++++++++++                                    | 27% ~01m 34s      
   |++++++++++++++                                    | 28% ~01m 32s      
   |+++++++++++++++                                   | 29% ~01m 31s      
   |+++++++++++++++                                   | 30% ~01m 30s      
   |++++++++++++++++                                  | 31% ~01m 28s      
   |++++++++++++++++                                  | 32% ~01m 27s      
   |+++++++++++++++++                                 | 33% ~01m 26s      
   |+++++++++++++++++                                | 34% ~01m 25s      
   |++++++++++++++++++                                | 35% ~01m 23s      
   |++++++++++++++++++                                | 36% ~01m 22s      
   |+++++++++++++++++++                               | 37% ~01m 21s      
   |+++++++++++++++++++                               | 38% ~01m 20s      
   |++++++++++++++++++++                              | 39% ~01m 18s      
   |++++++++++++++++++++                              | 40% ~01m 17s      
   |+++++++++++++++++++++                             | 41% ~01m 16s      
   |+++++++++++++++++++++                             | 42% ~01m 15s      
   |++++++++++++++++++++++                            | 43% ~01m 13s      
   |++++++++++++++++++++++                            | 44% ~01m 12s      
   |+++++++++++++++++++++++                           | 45% ~01m 11s      
   |+++++++++++++++++++++++                           | 46% ~01m 10s      
   |++++++++++++++++++++++++                          | 47% ~01m 09s      
   |++++++++++++++++++++++++                          | 48% ~01m 07s      
   |+++++++++++++++++++++++++                         | 49% ~01m 06s      
   |+++++++++++++++++++++++++                         | 50% ~01m 05s      
   |++++++++++++++++++++++++++                        | 51% ~01m 03s      
   |++++++++++++++++++++++++++                        | 52% ~01m 02s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 01s      
   |+++++++++++++++++++++++++++                       | 54% ~59s          
   |++++++++++++++++++++++++++++                      | 55% ~58s          
   |++++++++++++++++++++++++++++                     | 56% ~57s          
   |+++++++++++++++++++++++++++++                     | 57% ~56s          
   |+++++++++++++++++++++++++++++                     | 58% ~54s          
   |++++++++++++++++++++++++++++++                    | 59% ~53s          
   |++++++++++++++++++++++++++++++                    | 60% ~52s          
   |+++++++++++++++++++++++++++++++                   | 61% ~50s          
   |+++++++++++++++++++++++++++++++                   | 62% ~49s          
   |++++++++++++++++++++++++++++++++                  | 63% ~48s          
   |++++++++++++++++++++++++++++++++                  | 64% ~47s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~45s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~44s          
   |++++++++++++++++++++++++++++++++++                | 67% ~43s          
   |++++++++++++++++++++++++++++++++++               | 68% ~41s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~40s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~39s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~38s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~36s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~35s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~34s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~32s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~31s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~30s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~29s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~27s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~23s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 09s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 31s      
   |++                                                | 2 % ~01m 32s      
   |++                                                | 3 % ~01m 31s      
   |+++                                               | 4 % ~01m 31s      
   |+++                                               | 5 % ~01m 36s      
   |++++                                              | 6 % ~01m 35s      
   |++++                                              | 7 % ~01m 32s      
   |+++++                                             | 8 % ~01m 31s      
   |+++++                                             | 9 % ~01m 29s      
   |++++++                                            | 10% ~01m 28s      
   |++++++                                            | 11% ~01m 26s      
   |+++++++                                           | 12% ~01m 25s      
   |+++++++                                           | 13% ~01m 24s      
   |++++++++                                          | 14% ~01m 24s      
   |++++++++                                          | 15% ~01m 23s      
   |+++++++++                                         | 16% ~01m 22s      
   |+++++++++                                         | 18% ~01m 21s      
   |++++++++++                                        | 19% ~01m 20s      
   |++++++++++                                        | 20% ~01m 19s      
   |+++++++++++                                       | 21% ~01m 18s      
   |+++++++++++                                       | 22% ~01m 17s      
   |++++++++++++                                      | 23% ~01m 16s      
   |++++++++++++                                      | 24% ~01m 15s      
   |+++++++++++++                                     | 25% ~01m 14s      
   |+++++++++++++                                     | 26% ~01m 13s      
   |++++++++++++++                                    | 27% ~01m 12s      
   |++++++++++++++                                    | 28% ~01m 11s      
   |+++++++++++++++                                   | 29% ~01m 10s      
   |+++++++++++++++                                   | 30% ~01m 09s      
   |++++++++++++++++                                  | 31% ~01m 08s      
   |++++++++++++++++                                  | 32% ~01m 07s      
   |+++++++++++++++++                                 | 33% ~01m 06s      
   |++++++++++++++++++                                | 34% ~01m 05s      
   |++++++++++++++++++                                | 35% ~01m 04s      
   |+++++++++++++++++++                               | 36% ~01m 03s      
   |+++++++++++++++++++                               | 37% ~01m 02s      
   |++++++++++++++++++++                              | 38% ~01m 01s      
   |++++++++++++++++++++                              | 39% ~01m 00s      
   |+++++++++++++++++++++                             | 40% ~59s          
   |+++++++++++++++++++++                             | 41% ~58s          
   |++++++++++++++++++++++                            | 42% ~57s          
   |++++++++++++++++++++++                            | 43% ~56s          
   |+++++++++++++++++++++++                           | 44% ~55s          
   |+++++++++++++++++++++++                           | 45% ~54s          
   |++++++++++++++++++++++++                          | 46% ~53s          
   |++++++++++++++++++++++++                          | 47% ~52s          
   |+++++++++++++++++++++++++                         | 48% ~51s          
   |+++++++++++++++++++++++++                         | 49% ~50s          
   |++++++++++++++++++++++++++                        | 51% ~49s          
   |++++++++++++++++++++++++++                        | 52% ~48s          
   |+++++++++++++++++++++++++++                       | 53% ~47s          
   |+++++++++++++++++++++++++++                       | 54% ~46s          
   |++++++++++++++++++++++++++++                      | 55% ~45s          
   |++++++++++++++++++++++++++++                      | 56% ~44s          
   |+++++++++++++++++++++++++++++                     | 57% ~43s          
   |+++++++++++++++++++++++++++++                     | 58% ~41s          
   |++++++++++++++++++++++++++++++                    | 59% ~40s          
   |++++++++++++++++++++++++++++++                    | 60% ~39s          
   |+++++++++++++++++++++++++++++++                   | 61% ~38s          
   |+++++++++++++++++++++++++++++++                   | 62% ~37s          
   |++++++++++++++++++++++++++++++++                  | 63% ~36s          
   |++++++++++++++++++++++++++++++++                  | 64% ~35s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~34s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~33s          
   |++++++++++++++++++++++++++++++++++                | 67% ~32s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~31s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~30s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~29s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~28s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~27s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~26s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~25s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~24s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~23s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~22s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~21s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 38s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 45s      
   |++                                                | 2 % ~01m 44s      
   |++                                                | 3 % ~01m 51s      
   |+++                                               | 4 % ~01m 46s      
   |+++                                               | 5 % ~01m 42s      
   |++++                                              | 6 % ~01m 40s      
   |++++                                              | 7 % ~01m 38s      
   |+++++                                             | 8 % ~01m 37s      
   |+++++                                             | 9 % ~01m 36s      
   |++++++                                            | 10% ~01m 34s      
   |++++++                                            | 11% ~01m 33s      
   |+++++++                                           | 12% ~01m 33s      
   |+++++++                                           | 13% ~01m 31s      
   |++++++++                                          | 14% ~01m 30s      
   |++++++++                                          | 15% ~01m 29s      
   |+++++++++                                         | 16% ~01m 28s      
   |+++++++++                                         | 18% ~01m 27s      
   |++++++++++                                        | 19% ~01m 25s      
   |++++++++++                                        | 20% ~01m 24s      
   |+++++++++++                                       | 21% ~01m 23s      
   |+++++++++++                                       | 22% ~01m 22s      
   |++++++++++++                                      | 23% ~01m 20s      
   |++++++++++++                                      | 24% ~01m 19s      
   |+++++++++++++                                     | 25% ~01m 18s      
   |+++++++++++++                                     | 26% ~01m 17s      
   |++++++++++++++                                    | 27% ~01m 16s      
   |++++++++++++++                                    | 28% ~01m 15s      
   |+++++++++++++++                                   | 29% ~01m 14s      
   |+++++++++++++++                                   | 30% ~01m 13s      
   |++++++++++++++++                                  | 31% ~01m 12s      
   |++++++++++++++++                                  | 32% ~01m 11s      
   |+++++++++++++++++                                 | 33% ~01m 10s      
   |++++++++++++++++++                                | 34% ~01m 09s      
   |++++++++++++++++++                                | 35% ~01m 08s      
   |+++++++++++++++++++                               | 36% ~01m 07s      
   |+++++++++++++++++++                               | 37% ~01m 06s      
   |++++++++++++++++++++                              | 38% ~01m 05s      
   |++++++++++++++++++++                              | 39% ~01m 04s      
   |+++++++++++++++++++++                             | 40% ~01m 03s      
   |+++++++++++++++++++++                             | 41% ~01m 02s      
   |++++++++++++++++++++++                            | 42% ~01m 01s      
   |++++++++++++++++++++++                            | 43% ~60s          
   |+++++++++++++++++++++++                           | 44% ~59s          
   |+++++++++++++++++++++++                           | 45% ~58s          
   |++++++++++++++++++++++++                          | 46% ~56s          
   |++++++++++++++++++++++++                          | 47% ~55s          
   |+++++++++++++++++++++++++                         | 48% ~54s          
   |+++++++++++++++++++++++++                         | 49% ~53s          
   |++++++++++++++++++++++++++                        | 51% ~52s          
   |++++++++++++++++++++++++++                        | 52% ~51s          
   |+++++++++++++++++++++++++++                       | 53% ~50s          
   |+++++++++++++++++++++++++++                       | 54% ~49s          
   |++++++++++++++++++++++++++++                      | 55% ~48s          
   |++++++++++++++++++++++++++++                      | 56% ~47s          
   |+++++++++++++++++++++++++++++                     | 57% ~46s          
   |+++++++++++++++++++++++++++++                     | 58% ~45s          
   |++++++++++++++++++++++++++++++                    | 59% ~44s          
   |++++++++++++++++++++++++++++++                    | 60% ~43s          
   |+++++++++++++++++++++++++++++++                   | 61% ~41s          
   |+++++++++++++++++++++++++++++++                   | 62% ~40s          
   |++++++++++++++++++++++++++++++++                  | 63% ~39s          
   |++++++++++++++++++++++++++++++++                  | 64% ~38s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~37s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~36s          
   |++++++++++++++++++++++++++++++++++                | 67% ~35s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~34s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~33s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~32s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~31s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~30s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~27s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~26s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~25s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~24s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~23s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 45s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~04m 16s      
   |+                                                 | 2 % ~04m 15s      
   |++                                                | 3 % ~04m 08s      
   |++                                                | 4 % ~04m 05s      
   |+++                                               | 5 % ~03m 60s      
   |+++                                               | 6 % ~04m 01s      
   |++++                                              | 7 % ~03m 59s      
   |++++                                              | 8 % ~03m 57s      
   |+++++                                             | 9 % ~03m 54s      
   |+++++                                             | 10% ~03m 51s      
   |++++++                                            | 11% ~03m 49s      
   |++++++                                            | 12% ~03m 46s      
   |+++++++                                           | 13% ~03m 45s      
   |+++++++                                           | 14% ~03m 42s      
   |++++++++                                          | 15% ~03m 40s      
   |++++++++                                          | 16% ~03m 38s      
   |+++++++++                                         | 17% ~03m 35s      
   |+++++++++                                         | 18% ~03m 32s      
   |++++++++++                                        | 19% ~03m 30s      
   |++++++++++                                        | 20% ~03m 27s      
   |+++++++++++                                       | 21% ~03m 25s      
   |+++++++++++                                       | 22% ~03m 23s      
   |++++++++++++                                      | 23% ~03m 20s      
   |++++++++++++                                      | 24% ~03m 17s      
   |+++++++++++++                                     | 25% ~03m 15s      
   |+++++++++++++                                     | 26% ~03m 12s      
   |++++++++++++++                                    | 27% ~03m 09s      
   |++++++++++++++                                    | 28% ~03m 07s      
   |+++++++++++++++                                   | 29% ~03m 03s      
   |+++++++++++++++                                   | 30% ~03m 00s      
   |++++++++++++++++                                  | 31% ~02m 57s      
   |++++++++++++++++                                  | 32% ~02m 54s      
   |+++++++++++++++++                                 | 33% ~02m 52s      
   |+++++++++++++++++                                | 34% ~02m 49s      
   |++++++++++++++++++                                | 35% ~02m 46s      
   |++++++++++++++++++                                | 36% ~02m 43s      
   |+++++++++++++++++++                               | 37% ~02m 41s      
   |+++++++++++++++++++                               | 38% ~02m 39s      
   |++++++++++++++++++++                              | 39% ~02m 36s      
   |++++++++++++++++++++                              | 40% ~02m 33s      
   |+++++++++++++++++++++                             | 41% ~02m 31s      
   |+++++++++++++++++++++                             | 42% ~02m 28s      
   |++++++++++++++++++++++                            | 43% ~02m 26s      
   |++++++++++++++++++++++                            | 44% ~02m 23s      
   |+++++++++++++++++++++++                           | 45% ~02m 21s      
   |+++++++++++++++++++++++                           | 46% ~02m 18s      
   |++++++++++++++++++++++++                          | 47% ~02m 15s      
   |++++++++++++++++++++++++                          | 48% ~02m 13s      
   |+++++++++++++++++++++++++                         | 49% ~02m 10s      
   |+++++++++++++++++++++++++                         | 50% ~02m 08s      
   |++++++++++++++++++++++++++                        | 51% ~02m 05s      
   |++++++++++++++++++++++++++                        | 52% ~02m 02s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 60s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 57s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 54s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 52s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 49s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 46s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 44s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 41s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 39s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 36s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 34s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 31s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 29s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 26s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 23s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 21s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 18s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 16s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 13s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 11s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 08s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 06s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 03s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 01s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~58s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~56s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~53s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~51s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~48s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~46s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~43s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~41s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~38s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~35s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~33s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~23s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 04m 12s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 27s      
   |+                                                 | 2 % ~02m 26s      
   |++                                                | 3 % ~02m 24s      
   |++                                                | 4 % ~02m 24s      
   |+++                                               | 5 % ~02m 22s      
   |+++                                               | 6 % ~02m 18s      
   |++++                                              | 7 % ~02m 16s      
   |++++                                              | 8 % ~02m 14s      
   |+++++                                             | 9 % ~02m 13s      
   |+++++                                             | 10% ~02m 12s      
   |++++++                                            | 11% ~02m 10s      
   |++++++                                            | 12% ~02m 09s      
   |+++++++                                           | 13% ~02m 08s      
   |+++++++                                           | 14% ~02m 07s      
   |++++++++                                          | 15% ~02m 06s      
   |++++++++                                          | 16% ~02m 05s      
   |+++++++++                                         | 17% ~02m 03s      
   |+++++++++                                         | 18% ~02m 02s      
   |++++++++++                                        | 19% ~02m 01s      
   |++++++++++                                        | 20% ~01m 59s      
   |+++++++++++                                       | 21% ~01m 57s      
   |+++++++++++                                       | 22% ~01m 56s      
   |++++++++++++                                      | 23% ~01m 54s      
   |++++++++++++                                      | 24% ~01m 53s      
   |+++++++++++++                                     | 25% ~01m 51s      
   |+++++++++++++                                     | 26% ~01m 50s      
   |++++++++++++++                                    | 27% ~01m 48s      
   |++++++++++++++                                    | 28% ~01m 47s      
   |+++++++++++++++                                   | 29% ~01m 46s      
   |+++++++++++++++                                   | 30% ~01m 44s      
   |++++++++++++++++                                  | 31% ~01m 43s      
   |++++++++++++++++                                  | 32% ~01m 41s      
   |+++++++++++++++++                                 | 33% ~01m 40s      
   |+++++++++++++++++                                | 34% ~01m 38s      
   |++++++++++++++++++                                | 35% ~01m 37s      
   |++++++++++++++++++                                | 36% ~01m 35s      
   |+++++++++++++++++++                               | 37% ~01m 34s      
   |+++++++++++++++++++                               | 38% ~01m 32s      
   |++++++++++++++++++++                              | 39% ~01m 31s      
   |++++++++++++++++++++                              | 40% ~01m 29s      
   |+++++++++++++++++++++                             | 41% ~01m 28s      
   |+++++++++++++++++++++                             | 42% ~01m 26s      
   |++++++++++++++++++++++                            | 43% ~01m 25s      
   |++++++++++++++++++++++                            | 44% ~01m 23s      
   |+++++++++++++++++++++++                           | 45% ~01m 22s      
   |+++++++++++++++++++++++                           | 46% ~01m 20s      
   |++++++++++++++++++++++++                          | 47% ~01m 19s      
   |++++++++++++++++++++++++                          | 48% ~01m 18s      
   |+++++++++++++++++++++++++                         | 49% ~01m 16s      
   |+++++++++++++++++++++++++                         | 50% ~01m 15s      
   |++++++++++++++++++++++++++                        | 51% ~01m 13s      
   |++++++++++++++++++++++++++                        | 52% ~01m 12s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 10s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 09s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 07s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 06s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 04s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 03s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 01s      
   |++++++++++++++++++++++++++++++                    | 60% ~60s          
   |+++++++++++++++++++++++++++++++                   | 61% ~58s          
   |+++++++++++++++++++++++++++++++                   | 62% ~57s          
   |++++++++++++++++++++++++++++++++                  | 63% ~55s          
   |++++++++++++++++++++++++++++++++                  | 64% ~54s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~52s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~51s          
   |++++++++++++++++++++++++++++++++++                | 67% ~49s          
   |++++++++++++++++++++++++++++++++++               | 68% ~48s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~46s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~45s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~43s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~42s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~40s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~39s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~37s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~36s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~34s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~33s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~31s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~27s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 28s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 23s      
   |+                                                 | 2 % ~02m 18s      
   |++                                                | 3 % ~02m 14s      
   |++                                                | 4 % ~02m 11s      
   |+++                                               | 5 % ~02m 09s      
   |+++                                               | 6 % ~02m 07s      
   |++++                                              | 7 % ~02m 05s      
   |++++                                              | 8 % ~02m 03s      
   |+++++                                             | 9 % ~02m 01s      
   |+++++                                             | 10% ~01m 60s      
   |++++++                                            | 11% ~01m 59s      
   |++++++                                            | 12% ~01m 58s      
   |+++++++                                           | 13% ~01m 57s      
   |+++++++                                           | 14% ~01m 56s      
   |++++++++                                          | 15% ~01m 54s      
   |++++++++                                          | 16% ~01m 53s      
   |+++++++++                                         | 17% ~01m 52s      
   |+++++++++                                         | 18% ~01m 51s      
   |++++++++++                                        | 19% ~01m 49s      
   |++++++++++                                        | 20% ~01m 48s      
   |+++++++++++                                       | 21% ~01m 46s      
   |+++++++++++                                       | 22% ~01m 45s      
   |++++++++++++                                      | 23% ~01m 44s      
   |++++++++++++                                      | 24% ~01m 43s      
   |+++++++++++++                                     | 25% ~01m 41s      
   |+++++++++++++                                     | 26% ~01m 40s      
   |++++++++++++++                                    | 27% ~01m 39s      
   |++++++++++++++                                    | 28% ~01m 38s      
   |+++++++++++++++                                   | 29% ~01m 36s      
   |+++++++++++++++                                   | 30% ~01m 35s      
   |++++++++++++++++                                  | 31% ~01m 34s      
   |++++++++++++++++                                  | 32% ~01m 33s      
   |+++++++++++++++++                                 | 33% ~01m 31s      
   |+++++++++++++++++                                | 34% ~01m 30s      
   |++++++++++++++++++                                | 35% ~01m 29s      
   |++++++++++++++++++                                | 36% ~01m 27s      
   |+++++++++++++++++++                               | 37% ~01m 26s      
   |+++++++++++++++++++                               | 38% ~01m 25s      
   |++++++++++++++++++++                              | 39% ~01m 24s      
   |++++++++++++++++++++                              | 40% ~01m 22s      
   |+++++++++++++++++++++                             | 41% ~01m 21s      
   |+++++++++++++++++++++                             | 42% ~01m 20s      
   |++++++++++++++++++++++                            | 43% ~01m 18s      
   |++++++++++++++++++++++                            | 44% ~01m 17s      
   |+++++++++++++++++++++++                           | 45% ~01m 16s      
   |+++++++++++++++++++++++                           | 46% ~01m 14s      
   |++++++++++++++++++++++++                          | 47% ~01m 13s      
   |++++++++++++++++++++++++                          | 48% ~01m 11s      
   |+++++++++++++++++++++++++                         | 49% ~01m 10s      
   |+++++++++++++++++++++++++                         | 50% ~01m 09s      
   |++++++++++++++++++++++++++                        | 51% ~01m 07s      
   |++++++++++++++++++++++++++                        | 52% ~01m 06s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 05s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 03s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 02s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 01s      
   |+++++++++++++++++++++++++++++                     | 57% ~59s          
   |+++++++++++++++++++++++++++++                     | 58% ~58s          
   |++++++++++++++++++++++++++++++                    | 59% ~57s          
   |++++++++++++++++++++++++++++++                    | 60% ~55s          
   |+++++++++++++++++++++++++++++++                   | 61% ~54s          
   |+++++++++++++++++++++++++++++++                   | 62% ~53s          
   |++++++++++++++++++++++++++++++++                  | 63% ~51s          
   |++++++++++++++++++++++++++++++++                  | 64% ~50s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~49s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~47s          
   |++++++++++++++++++++++++++++++++++                | 67% ~46s          
   |++++++++++++++++++++++++++++++++++               | 68% ~45s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~43s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~42s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~39s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~36s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~35s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~33s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~32s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~31s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~29s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 16s

Display the top markers you computed above.

#tiss.markers %>% group_by(cluster) %>% top_n(5, avg_diff)

Assigning cell type identity to clusters

At a coarse level, we can use canonical markers to match the unbiased clustering to known cell types:

# stash current cluster IDs
tiss <- StashIdent(object = tiss, save.name = "cluster.ids")
# enumerate current cluster IDs and the labels for them
cluster.ids <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11)
cell_ontology_class <-
  c(
  "fibroblast",
  "fibroblast",
  "endothelial cell",
  "fibroblast",
  "leukocyte",
  "endothelial cell",
  "endothelial cell",
  "smooth muscle cell",
   "endocardial cell",
  "cardiac muscle cell",
  "leukocyte",
  "NA"
  )
cell_ontology_id <-
  c(
  "CL:0000057",
  "CL:0000057",
  "CL:0000115",
  "CL:0000057",
  "CL:0000738",
  "CL:0000115",
  "CL:0000115",
  "CL:0000192",
  "CL:0002350",
  "CL:0000746",
  "CL:0000738",
  "NA"
  )
tiss@meta.data[,'free_annotation'] <- NA
tiss@meta.data[,'cell_ontology_class'] <- plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = cell_ontology_class)
tiss@meta.data[,'cell_ontology_id'] <- plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = cell_ontology_id)
tiss@meta.data[tiss@cell.names,'cell_ontology_class'] <- as.character(tiss@meta.data$cell_ontology_class)
tiss@meta.data[tiss@cell.names,'cell_ontology_id'] <- as.character(tiss@meta.data$cell_ontology_id)
TSNEPlot(object = tiss, do.label = TRUE, pt.size = 0.5, group.by='cell_ontology_class')

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = tiss, do.return = TRUE, group.by = "plate.barcode")

Fb_3 all seem to be derived from mouse_38_F.

TSNEPlot(object = tiss, do.return = TRUE, group.by = “mouse.id”)

Edc all are derived from aorta.

TSNEPlot(object = tiss, do.return = TRUE, group.by = “subtissue”)

Print a table showing the count of cells in each identity category from each plate.

table(as.character(tiss@ident), as.character(tiss@meta.data$plate.barcode))
    
     B000412 B000633 B000634 B000636 B002010 B002011 B002421 B002423 B002427 B002428
  0       16     107      69       4     178      29      14      97     118      76
  1       10      23      47       5      25       2      11       5      66       1
  10       3       4       0       3       6       1       5      12       3       3
  11       0       1       4       1       2       0       0       2       0       2
  2       59      33      14      42      30       6      73      68      19       9
  3        2       9       0       5       7     156       0      23      51     187
  4        5      22       5       8      32      10       9      26      20       9
  5        7      13      12      11      10       1      13       4      24       0
  6       29       3       2      19       1       3      31      13       6       8
  7        7      10       4       2       5       2       9       9       9       6
  8        0      27      20       0      26       9       3       1      14      16
  9        0       4       1       1       1       1       2       0       3       1
    
     B002429 MAA000398 MAA000399 MAA000400 MAA000452 MAA000586 MAA000587 MAA000589
  0        2         6         7        34         4        86         1         6
  1        0        72        41        65        45        24        22        21
  10       3         3         2         2         1        10         2         0
  11       0         3         2         2         1         0         0         0
  2       12         4        22         4        23        13        18        29
  3        8         1         0         0         0         3         1         0
  4        3        19        15        13        17        36        13        14
  5        0        33        40        11        58        10        11         9
  6       79         0         9         0         3         1         2         4
  7        7        17        13        11        14         8        12        11
  8        0         3         2         4         0         9         1         1
  9        0         1         0         1         0         2         0         0
    
     MAA000898 MAA000899 MAA000901 MAA000903 MAA000917 MAA000918 MAA000919 MAA000920
  0          3        11         2        31         4         2         4        16
  1          5        17        14        20         1        19        51        66
  10         0         2         3         8         3         1         1         0
  11         0         0         1         2         0         0         1         0
  2          7         0        21        28         9         5         4        10
  3          1         1         0         9         1         0         2         2
  4          3         6        16        41         6        17        13         3
  5          7         1        15        18         0        11        18        11
  6          2         0         2         3        19         0         0         4
  7          1         1         6        14         3         8         6         8
  8          0         4         1         5         0         1         8         6
  9          0         0         0         1         0         0         7         7
    
     MAA000936 MAA100037 MAA100096 MAA100097
  0         17         0         0         0
  1         25         2         0         1
  10        16         0         0         0
  11         4         0         0         0
  2          2         1         0         0
  3          0         0         0         0
  4         45         0         0         0
  5         15         2         0         0
  6          0         4         0         0
  7         16         1         0         0
  8          3         1         0         0
  9          0        40        28        32

Subset and iterate

We can repeat the above analysis on a subset of cells, defined using cluster IDs or some other metadata. This is a good way to drill down and find substructure.

First subset

# Subset data based on cluster id
subtiss <- SubsetData(object = tiss, ident.use = c(7), do.center = F, do.scale = F, cells.use = )
# To subset data based on cell_ontology_class or other metadata, you can explicitly pass cell names
# anno = 'exocrine cells'
# cells.to.use = tiss@cell.names[which(tiss@meta.data$cell_ontology_class == anno)]
# subtiss <- SubsetData(object = tiss, cells.use = cells.to.use, do.center = F, do.scale = F)
subtiss <- NormalizeData(object = subtiss)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
subtiss <- ScaleData(object = subtiss, vars.to.regress = c("nReads", "percent.ribo","Rn45s"))
[1] "Regressing out nReads"       "Regressing out percent.ribo"
[3] "Regressing out Rn45s"       

  |                                                                                      
  |                                                                                |   0%
  |                                                                                      
  |=                                                                               |   1%
  |                                                                                      
  |=                                                                               |   2%
  |                                                                                      
  |==                                                                              |   2%
  |                                                                                      
  |==                                                                              |   3%
  |                                                                                      
  |===                                                                             |   3%
  |                                                                                      
  |===                                                                             |   4%
  |                                                                                      
  |====                                                                            |   5%
  |                                                                                      
  |====                                                                            |   6%
  |                                                                                      
  |=====                                                                           |   6%
  |                                                                                      
  |=====                                                                           |   7%
  |                                                                                      
  |======                                                                          |   7%
  |                                                                                      
  |======                                                                          |   8%
  |                                                                                      
  |=======                                                                         |   9%
  |                                                                                      
  |========                                                                        |   9%
  |                                                                                      
  |========                                                                        |  10%
  |                                                                                      
  |=========                                                                       |  11%
  |                                                                                      
  |=========                                                                       |  12%
  |                                                                                      
  |==========                                                                      |  12%
  |                                                                                      
  |==========                                                                      |  13%
  |                                                                                      
  |===========                                                                     |  13%
  |                                                                                      
  |===========                                                                     |  14%
  |                                                                                      
  |============                                                                    |  15%
  |                                                                                      
  |=============                                                                   |  16%
  |                                                                                      
  |=============                                                                   |  17%
  |                                                                                      
  |==============                                                                  |  17%
  |                                                                                      
  |==============                                                                  |  18%
  |                                                                                      
  |===============                                                                 |  18%
  |                                                                                      
  |===============                                                                 |  19%
  |                                                                                      
  |================                                                                |  20%
  |                                                                                      
  |================                                                                |  21%
  |                                                                                      
  |=================                                                               |  21%
  |                                                                                      
  |=================                                                               |  22%
  |                                                                                      
  |==================                                                              |  22%
  |                                                                                      
  |==================                                                              |  23%
  |                                                                                      
  |===================                                                             |  24%
  |                                                                                      
  |====================                                                            |  25%
  |                                                                                      
  |=====================                                                           |  26%
  |                                                                                      
  |======================                                                          |  27%
  |                                                                                      
  |======================                                                          |  28%
  |                                                                                      
  |=======================                                                         |  28%
  |                                                                                      
  |=======================                                                         |  29%
  |                                                                                      
  |========================                                                        |  29%
  |                                                                                      
  |========================                                                        |  30%
  |                                                                                      
  |=========================                                                       |  31%
  |                                                                                      
  |=========================                                                       |  32%
  |                                                                                      
  |==========================                                                      |  32%
  |                                                                                      
  |==========================                                                      |  33%
  |                                                                                      
  |===========================                                                     |  33%
  |                                                                                      
  |===========================                                                     |  34%
  |                                                                                      
  |============================                                                    |  35%
  |                                                                                      
  |=============================                                                   |  36%
  |                                                                                      
  |=============================                                                   |  37%
  |                                                                                      
  |==============================                                                  |  37%
  |                                                                                      
  |==============================                                                  |  38%
  |                                                                                      
  |===============================                                                 |  38%
  |                                                                                      
  |===============================                                                 |  39%
  |                                                                                      
  |================================                                                |  40%
  |                                                                                      
  |================================                                                |  41%
  |                                                                                      
  |=================================                                               |  41%
  |                                                                                      
  |==================================                                              |  42%
  |                                                                                      
  |==================================                                              |  43%
  |                                                                                      
  |===================================                                             |  43%
  |                                                                                      
  |===================================                                             |  44%
  |                                                                                      
  |====================================                                            |  44%
  |                                                                                      
  |====================================                                            |  45%
  |                                                                                      
  |=====================================                                           |  46%
  |                                                                                      
  |=====================================                                           |  47%
  |                                                                                      
  |======================================                                          |  47%
  |                                                                                      
  |======================================                                          |  48%
  |                                                                                      
  |=======================================                                         |  48%
  |                                                                                      
  |=======================================                                         |  49%
  |                                                                                      
  |========================================                                        |  50%
  |                                                                                      
  |=========================================                                       |  51%
  |                                                                                      
  |=========================================                                       |  52%
  |                                                                                      
  |==========================================                                      |  52%
  |                                                                                      
  |==========================================                                      |  53%
  |                                                                                      
  |===========================================                                     |  53%
  |                                                                                      
  |===========================================                                     |  54%
  |                                                                                      
  |============================================                                    |  55%
  |                                                                                      
  |============================================                                    |  56%
  |                                                                                      
  |=============================================                                   |  56%
  |                                                                                      
  |=============================================                                   |  57%
  |                                                                                      
  |==============================================                                  |  57%
  |                                                                                      
  |==============================================                                  |  58%
  |                                                                                      
  |===============================================                                 |  59%
  |                                                                                      
  |================================================                                |  59%
  |                                                                                      
  |================================================                                |  60%
  |                                                                                      
  |=================================================                               |  61%
  |                                                                                      
  |=================================================                               |  62%
  |                                                                                      
  |==================================================                              |  62%
  |                                                                                      
  |==================================================                              |  63%
  |                                                                                      
  |===================================================                             |  63%
  |                                                                                      
  |===================================================                             |  64%
  |                                                                                      
  |====================================================                            |  65%
  |                                                                                      
  |=====================================================                           |  66%
  |                                                                                      
  |=====================================================                           |  67%
  |                                                                                      
  |======================================================                          |  67%
  |                                                                                      
  |======================================================                          |  68%
  |                                                                                      
  |=======================================================                         |  68%
  |                                                                                      
  |=======================================================                         |  69%
  |                                                                                      
  |========================================================                        |  70%
  |                                                                                      
  |========================================================                        |  71%
  |                                                                                      
  |=========================================================                       |  71%
  |                                                                                      
  |=========================================================                       |  72%
  |                                                                                      
  |==========================================================                      |  72%
  |                                                                                      
  |==========================================================                      |  73%
  |                                                                                      
  |===========================================================                     |  74%
  |                                                                                      
  |============================================================                    |  75%
  |                                                                                      
  |=============================================================                   |  76%
  |                                                                                      
  |==============================================================                  |  77%
  |                                                                                      
  |==============================================================                  |  78%
  |                                                                                      
  |===============================================================                 |  78%
  |                                                                                      
  |===============================================================                 |  79%
  |                                                                                      
  |================================================================                |  79%
  |                                                                                      
  |================================================================                |  80%
  |                                                                                      
  |=================================================================               |  81%
  |                                                                                      
  |=================================================================               |  82%
  |                                                                                      
  |==================================================================              |  82%
  |                                                                                      
  |==================================================================              |  83%
  |                                                                                      
  |===================================================================             |  83%
  |                                                                                      
  |===================================================================             |  84%
  |                                                                                      
  |====================================================================            |  85%
  |                                                                                      
  |=====================================================================           |  86%
  |                                                                                      
  |=====================================================================           |  87%
  |                                                                                      
  |======================================================================          |  87%
  |                                                                                      
  |======================================================================          |  88%
  |                                                                                      
  |=======================================================================         |  88%
  |                                                                                      
  |=======================================================================         |  89%
  |                                                                                      
  |========================================================================        |  90%
  |                                                                                      
  |========================================================================        |  91%
  |                                                                                      
  |=========================================================================       |  91%
  |                                                                                      
  |==========================================================================      |  92%
  |                                                                                      
  |==========================================================================      |  93%
  |                                                                                      
  |===========================================================================     |  93%
  |                                                                                      
  |===========================================================================     |  94%
  |                                                                                      
  |============================================================================    |  94%
  |                                                                                      
  |============================================================================    |  95%
  |                                                                                      
  |=============================================================================   |  96%
  |                                                                                      
  |=============================================================================   |  97%
  |                                                                                      
  |==============================================================================  |  97%
  |                                                                                      
  |==============================================================================  |  98%
  |                                                                                      
  |=============================================================================== |  98%
  |                                                                                      
  |=============================================================================== |  99%
  |                                                                                      
  |================================================================================| 100%
[1] "Scaling data matrix"

  |                                                                                      
  |                                                                                |   0%
  |                                                                                      
  |================================================================================| 100%
subtiss <- FindVariableGenes(object = subtiss, do.plot = TRUE, x.high.cutoff = Inf, y.cutoff = 0.8)
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|

subtiss <- RunPCA(object = subtiss, pcs.compute = 20)
[1] "PC1"
 [1] "Postn"         "Vtn"           "Col6a1"        "Ifitm3"        "Mgp"          
 [6] "Tnfrsf21"      "Col6a2"        "Smpdl3a"       "Col3a1"        "E130203B14Rik"
[11] "Kdelr3"        "Plat"          "Nr1h3"         "P2ry14"        "Cfh"          
[16] "Fabp5"         "Tppp3"         "Cspg4"         "Hsd11b1"       "Spon1"        
[21] "Fn1"           "Trib2"         "Dcn"           "Rbp1"          "Hic1"         
[26] "Cd300lg"       "Pea15a"        "Dusp6"         "Tspan13"       "Cxcl12"       
[1] ""
 [1] "Myh11"         "Tagln"         "Nrip2"         "Sorbs2"        "Acta2"        
 [6] "Mustn1"        "Palld"         "Rcan2"         "Pln"           "Csrp1"        
[11] "Wtip"          "Lmod1"         "Pcp4l1"        "Rasd1"         "Tpm1"         
[16] "Asb2"          "Entpd1"        "Myl9"          "Sorbs1"        "Clu"          
[21] "Perp"          "Tpm2"          "B230120H23Rik" "Ccdc3"         "Gpr20"        
[26] "Mylk"          "Ptrf"          "Ckb"           "Cnn1"          "Npy1r"        
[1] ""
[1] ""
[1] "PC2"
 [1] "Col14a1"  "Loxl1"    "Fhl1"     "Apoe"     "Col6a2"   "Col6a1"   "Fam124a" 
 [8] "Ptgis"    "Rgs2"     "Eln"      "Gsn"      "Dkk3"     "F2r"      "Adamts2" 
[15] "Tmem176b" "Hsd11b1"  "Srpx"     "Igfbp3"   "Id2"      "Lgals3"   "Adamtsl2"
[22] "Adh1"     "Dpt"      "Cdc42ep3" "Stc1"     "Fbln5"    "Fetub"    "Col8a1"  
[29] "Id4"      "Lsp1"    
[1] ""
 [1] "Cxcl12"        "Vtn"           "Plxdc1"        "P2ry14"        "Plxdc2"       
 [6] "Pcp4l1"        "Ddit4l"        "Opcml"         "Klhl23"        "Phf17"        
[11] "Igfbp5"        "Chd2"          "Gm20199"       "Ppfibp2"       "Eftud2"       
[16] "Adora2b"       "Slc24a3"       "Gm17066"       "Atg16l1"       "Actc1"        
[21] "Pde4c"         "Sema7a"        "Car2"          "Ednrb"         "Aatk"         
[26] "Boc"           "Htr7"          "H2-Eb1"        "C330007P06Rik" "Gimap6"       
[1] ""
[1] ""
[1] "PC3"
 [1] "Ifi47"  "Ifit1"  "Plat"   "Cd34"   "Ifit3"  "Tgtp2"  "Ripk1"  "Iigp1"  "Dusp6" 
[10] "Cmpk2"  "Usp18"  "Cd274"  "Igtp"   "Plxdc2" "Rsad2"  "Haus3"  "Sele"   "Parp2" 
[19] "Tacc3"  "Snip1"  "Dcaf4"  "Armc10" "Bcar3"  "Tyms"   "Mocos"  "Ly6c1"  "Prc1"  
[28] "Ly6a"   "Btbd19" "Gbp2"  
[1] ""
 [1] "Gpbp1l1"       "Dnajb5"        "Mocs1"         "D930016D06Rik" "Ctdsp2"       
 [6] "Gm17066"       "Phxr4"         "Trmt5"         "1810014F10Rik" "Cwc25"        
[11] "R74862"        "Tgfbrap1"      "Ids"           "Samd14"        "Med30"        
[16] "Gm20199"       "Slc11a2"       "Gemin5"        "1700013N18Rik" "9930104L06Rik"
[21] "Amotl2"        "Tgfbr1"        "Pcgf3"         "Rufy3"         "Thap4"        
[26] "Ogn"           "Fam101a"       "Vezt"          "Nkd2"          "Vps13a"       
[1] ""
[1] ""
[1] "PC4"
 [1] "Cdc42ep3" "Gpx3"     "Fbln5"    "Cxcl12"   "Sdc1"     "Gstm1"    "Apoe"    
 [8] "Chrdl1"   "Cd36"     "Prss23"   "Lims2"    "Tppp3"    "Lmcd1"    "Prelp"   
[15] "Eya2"     "Enpp2"    "Ogn"      "Adam15"   "Mfap5"    "Mafk"     "Nov"     
[22] "Antxr1"   "Slc11a1"  "Tmem119"  "Ptrf"     "Pdgfd"    "Myl9"     "Lrp4"    
[29] "Lgals3"   "Fibin"   
[1] ""
 [1] "Lztfl1"        "Nt5dc1"        "Lars2"         "Morc3"         "C2cd3"        
 [6] "Klhl5"         "Smarca1"       "Mknk2"         "St8sia6"       "9130011E15Rik"
[11] "Fam168a"       "Mtor"          "Cspg4"         "Ep300"         "Wisp1"        
[16] "Crat"          "Hexim1"        "BC068281"      "Nop2"          "Zfp276"       
[21] "Trim36"        "Tmem170b"      "Git1"          "Zfp235"        "Megf6"        
[26] "Cd300lg"       "Rps6ka2"       "Ubiad1"        "Tfpi2"         "Cc2d2a"       
[1] ""
[1] ""
[1] "PC5"
 [1] "Adh1"     "Cd300lg"  "Nrxn1"    "Fetub"    "Usp24"    "Grpel1"   "Frzb"    
 [8] "Rrp36"    "Tusc2"    "Bet1l"    "Fam198b"  "Slc25a29" "Rusc1"    "Unk"     
[15] "Dbc1"     "Pde12"    "Tle3"     "Gcc2"     "Galnt11"  "Adamtsl2" "Cybasc3" 
[22] "Gstm1"    "Zfand1"   "Prkaa1"   "Socs4"    "Prrt2"    "Rabl5"    "Gdf10"   
[29] "Ankrd27"  "Slc35b3" 
[1] ""
 [1] "Dnajb5"        "Gm17066"       "Chac2"         "Tgfbrap1"      "Usp33"        
 [6] "Psd3"          "Rufy3"         "Zfp710"        "4930579G24Rik" "Slc25a40"     
[11] "Iigp1"         "Bcl2l2"        "Nkd2"          "Gpbp1l1"       "AI480653"     
[16] "1810014F10Rik" "Hspa4l"        "Cand1"         "D930016D06Rik" "Med30"        
[21] "Nrd1"          "Twistnb"       "Zfp1"          "Pcgf3"         "1700013N18Rik"
[26] "Cwc25"         "Spg20"         "Ifit3"         "Snap29"        "Ifi47"        
[1] ""
[1] ""
subtiss <- ProjectPCA(object = subtiss, do.print = FALSE)

Run Principal Component Analysis.

subtiss <- RunPCA(object = subtiss, do.print = FALSE)
subtiss <- ProjectPCA(object = subtiss, do.print = FALSE)
# If this fails for your subset, it may be that cells.use is more cells than you have left! Try reducing it.
PCHeatmap(object = subtiss, pc.use = 1:3, cells.use = 250, do.balanced = TRUE, label.columns = FALSE, num.genes = 12)

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = subtiss)

Choose the number of principal components to use.

# Set number of principal components. 
sub.n.pcs = 5

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale…higher resolution will give more clusters, lower resolution will give fewer.

# Set resolution 
sub.res.used <- 1
subtiss <- FindClusters(object = subtiss, reduction.type = "pca", dims.use = 1:sub.n.pcs, 
    resolution = sub.res.used, print.output = 0, save.SNN = TRUE)

To visualize

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
subtiss <- RunTSNE(object = subtiss, dims.use = 1:sub.n.pcs, seed.use = 10, perplexity=25)
# note that you can set do.label=T to help label individual clusters
TSNEPlot(object = subtiss, do.label = T)

subtiss.markers <- FindAllMarkers(object = subtiss, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02s          
   |++                                                | 2 % ~03s          
   |++                                                | 3 % ~03s          
   |+++                                               | 4 % ~02s          
   |+++                                               | 6 % ~02s          
   |++++                                              | 7 % ~02s          
   |++++                                              | 8 % ~02s          
   |+++++                                             | 9 % ~02s          
   |++++++                                            | 10% ~02s          
   |++++++                                            | 11% ~02s          
   |+++++++                                           | 12% ~02s          
   |+++++++                                           | 13% ~02s          
   |++++++++                                          | 15% ~02s          
   |++++++++                                          | 16% ~02s          
   |+++++++++                                         | 17% ~02s          
   |+++++++++                                         | 18% ~02s          
   |++++++++++                                        | 19% ~02s          
   |+++++++++++                                       | 20% ~02s          
   |+++++++++++                                       | 21% ~02s          
   |++++++++++++                                      | 22% ~02s          
   |++++++++++++                                      | 24% ~02s          
   |+++++++++++++                                     | 25% ~02s          
   |+++++++++++++                                     | 26% ~02s          
   |++++++++++++++                                    | 27% ~02s          
   |+++++++++++++++                                   | 28% ~02s          
   |+++++++++++++++                                   | 29% ~02s          
   |++++++++++++++++                                  | 30% ~02s          
   |++++++++++++++++                                  | 31% ~02s          
   |+++++++++++++++++                                 | 33% ~02s          
   |+++++++++++++++++                                 | 34% ~02s          
   |++++++++++++++++++                                | 35% ~02s          
   |++++++++++++++++++                                | 36% ~02s          
   |+++++++++++++++++++                               | 37% ~01s          
   |++++++++++++++++++++                              | 38% ~01s          
   |++++++++++++++++++++                              | 39% ~01s          
   |+++++++++++++++++++++                             | 40% ~01s          
   |+++++++++++++++++++++                             | 42% ~01s          
   |++++++++++++++++++++++                            | 43% ~01s          
   |++++++++++++++++++++++                            | 44% ~01s          
   |+++++++++++++++++++++++                           | 45% ~01s          
   |++++++++++++++++++++++++                          | 46% ~01s          
   |++++++++++++++++++++++++                          | 47% ~01s          
   |+++++++++++++++++++++++++                         | 48% ~01s          
   |+++++++++++++++++++++++++                         | 49% ~01s          
   |++++++++++++++++++++++++++                        | 51% ~01s          
   |++++++++++++++++++++++++++                        | 52% ~01s          
   |+++++++++++++++++++++++++++                       | 53% ~01s          
   |+++++++++++++++++++++++++++                       | 54% ~01s          
   |++++++++++++++++++++++++++++                      | 55% ~01s          
   |+++++++++++++++++++++++++++++                     | 56% ~01s          
   |+++++++++++++++++++++++++++++                     | 57% ~01s          
   |++++++++++++++++++++++++++++++                    | 58% ~01s          
   |++++++++++++++++++++++++++++++                    | 60% ~01s          
   |+++++++++++++++++++++++++++++++                   | 61% ~01s          
   |+++++++++++++++++++++++++++++++                   | 62% ~01s          
   |++++++++++++++++++++++++++++++++                  | 63% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
   |++++++++++++++++++++++++++++++++++                | 66% ~01s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~03s          
   |++                                                | 2 % ~03s          
   |++                                                | 3 % ~03s          
   |+++                                               | 4 % ~03s          
   |+++                                               | 5 % ~03s          
   |++++                                              | 6 % ~03s          
   |++++                                              | 7 % ~03s          
   |+++++                                             | 9 % ~03s          
   |+++++                                             | 10% ~03s          
   |++++++                                            | 11% ~03s          
   |++++++                                            | 12% ~03s          
   |+++++++                                           | 13% ~03s          
   |+++++++                                           | 14% ~03s          
   |++++++++                                          | 15% ~03s          
   |++++++++                                          | 16% ~03s          
   |+++++++++                                         | 17% ~03s          
   |++++++++++                                        | 18% ~03s          
   |++++++++++                                        | 19% ~03s          
   |+++++++++++                                       | 20% ~03s          
   |+++++++++++                                       | 21% ~03s          
   |++++++++++++                                      | 22% ~03s          
   |++++++++++++                                      | 23% ~03s          
   |+++++++++++++                                     | 24% ~03s          
   |+++++++++++++                                     | 26% ~03s          
   |++++++++++++++                                    | 27% ~03s          
   |++++++++++++++                                    | 28% ~03s          
   |+++++++++++++++                                   | 29% ~03s          
   |+++++++++++++++                                   | 30% ~03s          
   |++++++++++++++++                                  | 31% ~03s          
   |++++++++++++++++                                  | 32% ~03s          
   |+++++++++++++++++                                 | 33% ~03s          
   |++++++++++++++++++                                | 34% ~02s          
   |++++++++++++++++++                                | 35% ~02s          
   |+++++++++++++++++++                               | 36% ~02s          
   |+++++++++++++++++++                               | 37% ~02s          
   |++++++++++++++++++++                              | 38% ~02s          
   |++++++++++++++++++++                              | 39% ~02s          
   |+++++++++++++++++++++                             | 40% ~02s          
   |+++++++++++++++++++++                             | 41% ~02s          
   |++++++++++++++++++++++                            | 43% ~02s          
   |++++++++++++++++++++++                            | 44% ~02s          
   |+++++++++++++++++++++++                           | 45% ~02s          
   |+++++++++++++++++++++++                           | 46% ~02s          
   |++++++++++++++++++++++++                          | 47% ~02s          
   |++++++++++++++++++++++++                          | 48% ~02s          
   |+++++++++++++++++++++++++                         | 49% ~02s          
   |+++++++++++++++++++++++++                         | 50% ~02s          
   |++++++++++++++++++++++++++                        | 51% ~02s          
   |+++++++++++++++++++++++++++                       | 52% ~02s          
   |+++++++++++++++++++++++++++                       | 53% ~02s          
   |++++++++++++++++++++++++++++                      | 54% ~02s          
   |++++++++++++++++++++++++++++                      | 55% ~02s          
   |+++++++++++++++++++++++++++++                     | 56% ~02s          
   |+++++++++++++++++++++++++++++                     | 57% ~02s          
   |++++++++++++++++++++++++++++++                    | 59% ~01s          
   |++++++++++++++++++++++++++++++                    | 60% ~01s          
   |+++++++++++++++++++++++++++++++                   | 61% ~01s          
   |+++++++++++++++++++++++++++++++                   | 62% ~01s          
   |++++++++++++++++++++++++++++++++                  | 63% ~01s          
   |++++++++++++++++++++++++++++++++                  | 64% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02s          
   |++                                                | 2 % ~02s          
   |++                                                | 3 % ~02s          
   |+++                                               | 4 % ~02s          
   |+++                                               | 5 % ~02s          
   |++++                                              | 6 % ~02s          
   |++++                                              | 7 % ~02s          
   |+++++                                             | 8 % ~02s          
   |+++++                                             | 9 % ~02s          
   |++++++                                            | 10% ~02s          
   |++++++                                            | 11% ~02s          
   |+++++++                                           | 12% ~02s          
   |+++++++                                           | 13% ~02s          
   |++++++++                                          | 14% ~02s          
   |++++++++                                          | 15% ~02s          
   |+++++++++                                         | 16% ~02s          
   |+++++++++                                         | 17% ~02s          
   |++++++++++                                        | 18% ~02s          
   |++++++++++                                        | 19% ~02s          
   |+++++++++++                                       | 20% ~02s          
   |+++++++++++                                       | 21% ~02s          
   |++++++++++++                                      | 22% ~02s          
   |++++++++++++                                      | 23% ~02s          
   |+++++++++++++                                     | 24% ~02s          
   |+++++++++++++                                     | 25% ~02s          
   |++++++++++++++                                    | 26% ~02s          
   |++++++++++++++                                    | 27% ~02s          
   |+++++++++++++++                                   | 28% ~02s          
   |+++++++++++++++                                   | 29% ~02s          
   |++++++++++++++++                                  | 30% ~02s          
   |++++++++++++++++                                  | 31% ~02s          
   |+++++++++++++++++                                 | 32% ~02s          
   |+++++++++++++++++                                 | 33% ~02s          
   |++++++++++++++++++                                | 34% ~02s          
   |++++++++++++++++++                                | 35% ~02s          
   |+++++++++++++++++++                               | 36% ~01s          
   |+++++++++++++++++++                               | 37% ~01s          
   |++++++++++++++++++++                              | 38% ~01s          
   |++++++++++++++++++++                              | 39% ~01s          
   |+++++++++++++++++++++                             | 40% ~01s          
   |+++++++++++++++++++++                             | 41% ~01s          
   |++++++++++++++++++++++                            | 42% ~01s          
   |++++++++++++++++++++++                            | 43% ~01s          
   |+++++++++++++++++++++++                           | 44% ~01s          
   |+++++++++++++++++++++++                           | 45% ~01s          
   |++++++++++++++++++++++++                          | 46% ~01s          
   |++++++++++++++++++++++++                          | 47% ~01s          
   |+++++++++++++++++++++++++                         | 48% ~01s          
   |+++++++++++++++++++++++++                         | 49% ~01s          
   |++++++++++++++++++++++++++                        | 51% ~01s          
   |++++++++++++++++++++++++++                        | 52% ~01s          
   |+++++++++++++++++++++++++++                       | 53% ~01s          
   |+++++++++++++++++++++++++++                       | 54% ~01s          
   |++++++++++++++++++++++++++++                      | 55% ~01s          
   |++++++++++++++++++++++++++++                      | 56% ~01s          
   |+++++++++++++++++++++++++++++                     | 57% ~01s          
   |+++++++++++++++++++++++++++++                     | 58% ~01s          
   |++++++++++++++++++++++++++++++                    | 59% ~01s          
   |++++++++++++++++++++++++++++++                    | 60% ~01s          
   |+++++++++++++++++++++++++++++++                   | 61% ~01s          
   |+++++++++++++++++++++++++++++++                   | 62% ~01s          
   |++++++++++++++++++++++++++++++++                  | 63% ~01s          
   |++++++++++++++++++++++++++++++++                  | 64% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |++++++++++++++++++++++++++++++++++                | 68% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05s          
   |++                                                | 2 % ~05s          
   |++                                                | 3 % ~05s          
   |+++                                               | 4 % ~05s          
   |+++                                               | 5 % ~05s          
   |++++                                              | 6 % ~05s          
   |++++                                              | 7 % ~05s          
   |+++++                                             | 8 % ~05s          
   |+++++                                             | 9 % ~05s          
   |++++++                                            | 10% ~04s          
   |++++++                                            | 11% ~04s          
   |+++++++                                           | 12% ~04s          
   |+++++++                                           | 13% ~04s          
   |++++++++                                          | 14% ~04s          
   |++++++++                                          | 15% ~04s          
   |+++++++++                                         | 16% ~04s          
   |+++++++++                                         | 18% ~04s          
   |++++++++++                                        | 19% ~04s          
   |++++++++++                                        | 20% ~04s          
   |+++++++++++                                       | 21% ~04s          
   |+++++++++++                                       | 22% ~04s          
   |++++++++++++                                      | 23% ~04s          
   |++++++++++++                                      | 24% ~04s          
   |+++++++++++++                                     | 25% ~04s          
   |+++++++++++++                                     | 26% ~04s          
   |++++++++++++++                                    | 27% ~04s          
   |++++++++++++++                                    | 28% ~04s          
   |+++++++++++++++                                   | 29% ~04s          
   |+++++++++++++++                                   | 30% ~04s          
   |++++++++++++++++                                  | 31% ~04s          
   |++++++++++++++++                                  | 32% ~03s          
   |+++++++++++++++++                                 | 33% ~03s          
   |++++++++++++++++++                                | 34% ~03s          
   |++++++++++++++++++                                | 35% ~03s          
   |+++++++++++++++++++                               | 36% ~03s          
   |+++++++++++++++++++                               | 37% ~03s          
   |++++++++++++++++++++                              | 38% ~03s          
   |++++++++++++++++++++                              | 39% ~03s          
   |+++++++++++++++++++++                             | 40% ~03s          
   |+++++++++++++++++++++                             | 41% ~03s          
   |++++++++++++++++++++++                            | 42% ~03s          
   |++++++++++++++++++++++                            | 43% ~03s          
   |+++++++++++++++++++++++                           | 44% ~03s          
   |+++++++++++++++++++++++                           | 45% ~03s          
   |++++++++++++++++++++++++                          | 46% ~03s          
   |++++++++++++++++++++++++                          | 47% ~03s          
   |+++++++++++++++++++++++++                         | 48% ~03s          
   |+++++++++++++++++++++++++                         | 49% ~03s          
   |++++++++++++++++++++++++++                        | 51% ~03s          
   |++++++++++++++++++++++++++                        | 52% ~02s          
   |+++++++++++++++++++++++++++                       | 53% ~02s          
   |+++++++++++++++++++++++++++                       | 54% ~02s          
   |++++++++++++++++++++++++++++                      | 55% ~02s          
   |++++++++++++++++++++++++++++                      | 56% ~02s          
   |+++++++++++++++++++++++++++++                     | 57% ~02s          
   |+++++++++++++++++++++++++++++                     | 58% ~02s          
   |++++++++++++++++++++++++++++++                    | 59% ~02s          
   |++++++++++++++++++++++++++++++                    | 60% ~02s          
   |+++++++++++++++++++++++++++++++                   | 61% ~02s          
   |+++++++++++++++++++++++++++++++                   | 62% ~02s          
   |++++++++++++++++++++++++++++++++                  | 63% ~02s          
   |++++++++++++++++++++++++++++++++                  | 64% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
   |++++++++++++++++++++++++++++++++++                | 67% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05s
subtiss.markers %>% group_by(cluster) %>% top_n(6, avg_diff)

Check expression of genes of interset.

genes_to_check = c('Kcnj8','Postn','Myh11','Cnn1')
FeaturePlot(subtiss, genes_to_check, pt.size = 1)

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest.

# To change the y-axis to show raw counts, add use.raw = T.
DotPlot(subtiss, genes_to_check, plot.legend = T)

How big are the clusters?

table(subtiss@ident)

 0  1  2  3 
74 52 52 42 

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = subtiss, do.return = TRUE, group.by = "plate.barcode")

Print a table showing the count of cells in each identity category from each plate.

table(as.character(subtiss@ident), as.character(subtiss@meta.data$plate.barcode))
   
    B000412 B000633 B000634 B000636 B002010 B002011 B002421 B002423 B002427 B002428
  0       2       1       3       2       1       0       4       6       3       3
  1       2       7       0       0       0       0       0       1       1       0
  2       1       0       0       0       0       0       2       1       1       0
  3       2       2       1       0       4       2       3       1       4       3
   
    B002429 MAA000398 MAA000399 MAA000400 MAA000452 MAA000586 MAA000587 MAA000589
  0       3         4        10         5         9         1         6         1
  1       0         2         0         1         0         6         0         1
  2       4         9         1         5         4         1         4         4
  3       0         2         2         0         1         0         2         5
   
    MAA000898 MAA000899 MAA000901 MAA000903 MAA000917 MAA000918 MAA000919 MAA000920
  0         0         0         3         0         1         1         1         4
  1         0         1         0        12         0         1         0         1
  2         0         0         3         0         1         4         4         3
  3         1         0         0         2         1         2         1         0
   
    MAA000936 MAA100037
  0         0         0
  1        16         0
  2         0         0
  3         0         1

Assigning subcell_ontology_classs

For the subsets, we produce subcell_ontology_classs. These will be written back as metadata in the original object, so we can see all subcell_ontology_classs together.

If some of the clusters you find in the subset deserve additional cell_ontology_class, you can add that right here. Use NA for clusters for which no subcell_ontology_class is needed.

subcluster.ids <- c(0, 1, 2, 3)
subfree_annotation <- c()
subcell_ontology_class <-c("Myofibroblast","Myofibroblast","Myofibroblast","Smooth_Muscle_Cells")
subtiss@meta.data[,'subcell_ontology_class'] <- plyr::mapvalues(x = subtiss@ident, from = subcluster.ids, to = subcell_ontology_class)
tiss@meta.data[subtiss@cell.names,'subcell_ontology_class'] <- as.character(subtiss@meta.data$subcell_ontology_class)
TSNEPlot(object = subtiss, do.label = TRUE, pt.size = 0.5, group.by='subcell_ontology_class')

Save the Robject for later

When you save the annotated tissue, please give it a name.

filename = here('00_data_ingest', '04_tissue_robj_generated', 
                     paste0("facs", tissue_of_interest, "_seurat_tiss.Robj"))
print(filename)
[1] "/Users/guangli/Documents/GitHub/tabula-muris/00_data_ingest/04_tissue_robj_generated/facsHeart_seurat_tiss.Robj"
save(tiss, file=filename)

Export the final metadata

So that Biohub can easily combine all your cell_ontology_classs, please export them as a simple csv.

head(tiss@meta.data)
filename = here('00_data_ingest', '03_tissue_cell_ontology_class_csv', 
                     paste0(tissue_of_interest, "_cell_ontology_class.csv"))
write.csv(tiss@meta.data[,c('plate.barcode','cell_ontology_class','cell_ontology_id')], file=filename)
cannot open file '/Users/guangli/Documents/GitHub/tabula-muris/00_data_ingest/03_tissue_cell_ontology_class_csv/Heart_cell_ontology_class.csv': No such file or directoryError in file(file, ifelse(append, "a", "w")) : 
  cannot open the connection
LS0tCnRpdGxlOiAiSGVhcnQgRkFDUyBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU3BlY2lmeSB0aGUgdGlzc3VlIG9mIGludGVyZXN0LCBydW4gdGhlIGJvaWxlcnBsYXRlIGNvZGUgd2hpY2ggc2V0cyB1cCB0aGUgZnVuY3Rpb25zIGFuZCBlbnZpcm9ubWVudCwgbG9hZCB0aGUgdGlzc3VlIG9iamVjdC4KCmBgYHtyfQp0aXNzdWVfb2ZfaW50ZXJlc3QgPSAiSGVhcnQiCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoIjAwX2RhdGFfaW5nZXN0IiwgIjAyX3Rpc3N1ZV9hbmFseXNpc19ybWQiLCAiYm9pbGVycGxhdGUuUiIpKQp0aXNzPWxvYWRfdGlzc3VlX2ZhY3ModGlzc3VlX29mX2ludGVyZXN0KQpgYGAKClZpc3VhbGl6ZSB0b3AgZ2VuZXMgaW4gcHJpbmNpcGFsIGNvbXBvbmVudHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04fQpQQ0hlYXRtYXAob2JqZWN0ID0gdGlzcywgcGMudXNlID0gMTozLCBjZWxscy51c2UgPSA1MDAsIGRvLmJhbGFuY2VkID0gVFJVRSwgbGFiZWwuY29sdW1ucyA9IEZBTFNFLCBudW0uZ2VuZXMgPSA4KQpgYGAKCkxhdGVyIG9uIChpbiBGaW5kQ2x1c3RlcnMgYW5kIFRTTkUpIHlvdSB3aWxsIHBpY2sgYSBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMgdG8gdXNlLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGtlZXBpbmcgdGhlIG1ham9yIGRpcmVjdGlvbnMgb2YgdmFyaWF0aW9uIGluIHRoZSBkYXRhIGFuZCwgaWRlYWxseSwgc3VwcmVzc2luZyBub2lzZS4gVGhlcmUgaXMgbm8gY29ycmVjdCBhbnN3ZXIgdG8gdGhlIG51bWJlciB0byB1c2UsIGJ1dCBhIGRlY2VudCBydWxlIG9mIHRodW1iIGlzIHRvIGdvIHVudGlsIHRoZSBwbG90IHBsYXRlYXVzLgoKYGBge3J9ClBDRWxib3dQbG90KG9iamVjdCA9IHRpc3MpCmBgYAoKQ2hvb3NlIHRoZSBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMgdG8gdXNlLgpgYGB7cn0KIyBTZXQgbnVtYmVyIG9mIHByaW5jaXBhbCBjb21wb25lbnRzLiAKbi5wY3MgPSAxMApgYGAKCgpUaGUgY2x1c3RlcmluZyBpcyBwZXJmb3JtZWQgYmFzZWQgb24gYSBuZWFyZXN0IG5laWdoYm9ycyBncmFwaC4gQ2VsbHMgdGhhdCBoYXZlIHNpbWlsYXIgZXhwcmVzc2lvbiB3aWxsIGJlIGpvaW5lZCB0b2dldGhlci4gVGhlIExvdXZhaW4gYWxnb3JpdGhtIGxvb2tzIGZvciBncm91cHMgb2YgY2VsbHMgd2l0aCBoaWdoIG1vZHVsYXJpdHktLW1vcmUgY29ubmVjdGlvbnMgd2l0aGluIHRoZSBncm91cCB0aGFuIGJldHdlZW4gZ3JvdXBzLiBUaGUgcmVzb2x1dGlvbiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgc2NhbGUuLi5oaWdoZXIgcmVzb2x1dGlvbiB3aWxsIGdpdmUgbW9yZSBjbHVzdGVycywgbG93ZXIgcmVzb2x1dGlvbiB3aWxsIGdpdmUgZmV3ZXIuCgpGb3IgdGhlIHRvcC1sZXZlbCBjbHVzdGVyaW5nLCBhaW0gdG8gdW5kZXItY2x1c3RlciBpbnN0ZWFkIG9mIG92ZXItY2x1c3Rlci4gSXQgd2lsbCBiZSBlYXN5IHRvIHN1YnNldCBncm91cHMgYW5kIGZ1cnRoZXIgYW5hbHl6ZSB0aGVtIGJlbG93LgoKYGBge3J9CiMgU2V0IHJlc29sdXRpb24gCnJlcy51c2VkIDwtIDAuNQoKdGlzcyA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gdGlzcywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKClRvIHZpc3VhbGl6ZSAKYGBge3J9CiMgSWYgY2VsbHMgYXJlIHRvbyBzcHJlYWQgb3V0LCB5b3UgY2FuIHJhaXNlIHRoZSBwZXJwbGV4aXR5LiBJZiB5b3UgaGF2ZSBmZXcgY2VsbHMsIHRyeSBhIGxvd2VyIHBlcnBsZXhpdHkgKGJ1dCBuZXZlciBsZXNzIHRoYW4gMTApLgp0aXNzIDwtIFJ1blRTTkUob2JqZWN0ID0gdGlzcywgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwKQpgYGAKCmBgYHtyfQojIG5vdGUgdGhhdCB5b3UgY2FuIHNldCBkby5sYWJlbD1UIHRvIGhlbHAgbGFiZWwgaW5kaXZpZHVhbCBjbHVzdGVycwpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5sYWJlbCA9IFQpCmBgYAoKQ2hlY2sgZXhwcmVzc2lvbiBvZiBnZW5lcyBvZiBpbnRlcnNldC4KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0KCiNDTSBsaW5lYWdlIGdlbmVzCiNnZW5lc190b19jaGVjayA9IGMoJ1NsbicsICdNeWw3JywnTXlsMicsICdUbm5pMycpCiNGZWF0dXJlUGxvdCh0aXNzLCBnZW5lc190b19jaGVjaywgcHQuc2l6ZSA9IDEsIG5Db2wgPSAzKQoKI0VEQyBsaW5lYWdlIGdlbmVzCmdlbmVzX3RvX2NoZWNrID0gYygnQ2RoNScsICdQZWNhbTEnLCdUaWUxJykKRmVhdHVyZVBsb3QodGlzcywgZ2VuZXNfdG9fY2hlY2ssIHB0LnNpemUgPSAxLCBuQ29sID0gMykgCgpGZWF0dXJlUGxvdCh0aXNzLCBmZWF0dXJlcy5wbG90PWMoJ0NkaDUnLCAnUGVjYW0xJywnVGllMScpLCBjb2xzLnVzZT1jKCJncmV5IiwiYmx1ZSIpLHJlZHVjdGlvbi51c2U9InRzbmUiKQoKI0ZiIGxpbmVhZ2UgZ2VuZXMKI2dlbmVzX3RvX2NoZWNrID0gYygnRGNuJywnR3NuJywnQ29sMWExJywgJ1RjZjIxJykKI0ZlYXR1cmVQbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrLCBwdC5zaXplID0gMSwgbkNvbCA9IDMpIAoKI1NNQyBnZW5lcywgYmxvb2QvaW1tdW5lIGNlbGwsIGNvbmR1Y3Rpb24gY2VsbHMgZ2VuZXMKI2dlbmVzX3RvX2NoZWNrID0gYygnQ29sM2ExJywnQ2F2MScsJ0RjbicsJ1NveDknLCdDMXFiJywnRmFicDQnLCdNeWgxMScsICdWd2YnLCAnVG5uaTMnLCdDZDM3JywnVGllMScsJ0hiYi1iMScpCiNGZWF0dXJlUGxvdCh0aXNzLCBnZW5lc190b19jaGVjaywgcHQuc2l6ZSA9IDEsIG5Db2wgPSAzKQoKYGBgCgpEb3RwbG90cyBsZXQgeW91IHNlZSB0aGUgaW50ZW5zaXR5IG9mIGV4cHByZXNzaW9uIGFuZCB0aGUgZnJhY3Rpb24gb2YgY2VsbHMgZXhwcmVzc2luZyBmb3IgZWFjaCBvZiB5b3VyIGdlbmVzIG9mIGludGVyZXN0LgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTh9CiMgVG8gY2hhbmdlIHRoZSB5LWF4aXMgdG8gc2hvdyByYXcgY291bnRzLCBhZGQgdXNlLnJhdyA9IFQuCkRvdFBsb3QodGlzcywgZ2VuZXNfdG9fY2hlY2ssIHBsb3QubGVnZW5kID0gVCkKYGBgCgpIb3cgYmlnIGFyZSB0aGUgY2x1c3RlcnM/CmBgYHtyfQp0YWJsZSh0aXNzQGlkZW50KQpgYGAKCldoaWNoIG1hcmtlcnMgaWRlbnRpZnkgYSBzcGVjaWZpYyBjbHVzdGVyPwoKYGBge3J9CmNsdXN0Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDAsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIHRocmVzaC51c2UgPSAwLjI1KQpgYGAKCmBgYHtyfQpwcmludCh4ID0gaGVhZCh4PSBjbHVzdC5tYXJrZXJzLCBuID0gMTApKQpgYGAKCllvdSBjYW4gYWxzbyBjb21wdXRlIGFsbCBtYXJrZXJzIGZvciBhbGwgY2x1c3RlcnMgYXQgb25jZS4gVGhpcyBtYXkgdGFrZSBzb21lIHRpbWUuCmBgYHtyfQp0aXNzLm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMob2JqZWN0ID0gdGlzcywgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgdGhyZXNoLnVzZSA9IDAuMjUpCmBgYAoKRGlzcGxheSB0aGUgdG9wIG1hcmtlcnMgeW91IGNvbXB1dGVkIGFib3ZlLgpgYGB7cn0KI3Rpc3MubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDUsIGF2Z19kaWZmKQpgYGAKCiMjIEFzc2lnbmluZyBjZWxsIHR5cGUgaWRlbnRpdHkgdG8gY2x1c3RlcnMKCkF0IGEgY29hcnNlIGxldmVsLCB3ZSBjYW4gdXNlIGNhbm9uaWNhbCBtYXJrZXJzIHRvIG1hdGNoIHRoZSB1bmJpYXNlZCBjbHVzdGVyaW5nIHRvIGtub3duIGNlbGwgdHlwZXM6CgpgYGB7cn0KIyBzdGFzaCBjdXJyZW50IGNsdXN0ZXIgSURzCnRpc3MgPC0gU3Rhc2hJZGVudChvYmplY3QgPSB0aXNzLCBzYXZlLm5hbWUgPSAiY2x1c3Rlci5pZHMiKQoKIyBlbnVtZXJhdGUgY3VycmVudCBjbHVzdGVyIElEcyBhbmQgdGhlIGxhYmVscyBmb3IgdGhlbQpjbHVzdGVyLmlkcyA8LSBjKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEpCmNlbGxfb250b2xvZ3lfY2xhc3MgPC0KICBjKAogICJmaWJyb2JsYXN0IiwKICAiZmlicm9ibGFzdCIsCiAgImVuZG90aGVsaWFsIGNlbGwiLAogICJmaWJyb2JsYXN0IiwKICAibGV1a29jeXRlIiwKICAiZW5kb3RoZWxpYWwgY2VsbCIsCiAgImVuZG90aGVsaWFsIGNlbGwiLAogICJzbW9vdGggbXVzY2xlIGNlbGwiLAogICAiZW5kb2NhcmRpYWwgY2VsbCIsCiAgImNhcmRpYWMgbXVzY2xlIGNlbGwiLAogICJsZXVrb2N5dGUiLAogICJOQSIKICApCmNlbGxfb250b2xvZ3lfaWQgPC0KICBjKAogICJDTDowMDAwMDU3IiwKICAiQ0w6MDAwMDA1NyIsCiAgIkNMOjAwMDAxMTUiLAogICJDTDowMDAwMDU3IiwKICAiQ0w6MDAwMDczOCIsCiAgIkNMOjAwMDAxMTUiLAogICJDTDowMDAwMTE1IiwKICAiQ0w6MDAwMDE5MiIsCiAgIkNMOjAwMDIzNTAiLAogICJDTDowMDAwNzQ2IiwKICAiQ0w6MDAwMDczOCIsCiAgIk5BIgogICkKCnRpc3NAbWV0YS5kYXRhWywnZnJlZV9hbm5vdGF0aW9uJ10gPC0gTkEKdGlzc0BtZXRhLmRhdGFbLCdjZWxsX29udG9sb2d5X2NsYXNzJ10gPC0gcGx5cjo6bWFwdmFsdWVzKHggPSB0aXNzQGlkZW50LCBmcm9tID0gY2x1c3Rlci5pZHMsIHRvID0gY2VsbF9vbnRvbG9neV9jbGFzcykKdGlzc0BtZXRhLmRhdGFbLCdjZWxsX29udG9sb2d5X2lkJ10gPC0gcGx5cjo6bWFwdmFsdWVzKHggPSB0aXNzQGlkZW50LCBmcm9tID0gY2x1c3Rlci5pZHMsIHRvID0gY2VsbF9vbnRvbG9neV9pZCkKCnRpc3NAbWV0YS5kYXRhW3Rpc3NAY2VsbC5uYW1lcywnY2VsbF9vbnRvbG9neV9jbGFzcyddIDwtIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRjZWxsX29udG9sb2d5X2NsYXNzKQp0aXNzQG1ldGEuZGF0YVt0aXNzQGNlbGwubmFtZXMsJ2NlbGxfb250b2xvZ3lfaWQnXSA8LSBhcy5jaGFyYWN0ZXIodGlzc0BtZXRhLmRhdGEkY2VsbF9vbnRvbG9neV9pZCkKClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLmxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnk9J2NlbGxfb250b2xvZ3lfY2xhc3MnKQpgYGAKCgojIyBDaGVja2luZyBmb3IgYmF0Y2ggZWZmZWN0cwoKCkNvbG9yIGJ5IG1ldGFkYXRhLCBsaWtlIHBsYXRlIGJhcmNvZGUsIHRvIGNoZWNrIGZvciBiYXRjaCBlZmZlY3RzLgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ucmV0dXJuID0gVFJVRSwgZ3JvdXAuYnkgPSAicGxhdGUuYmFyY29kZSIpCmBgYAojIyNGYl8zIGFsbCBzZWVtIHRvIGJlIGRlcml2ZWQgZnJvbSBtb3VzZV8zOF9GLgojI1RTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gIm1vdXNlLmlkIikKCiMjI0VkYyBhbGwgYXJlIGRlcml2ZWQgZnJvbSBhb3J0YS4KIyNUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJzdWJ0aXNzdWUiKQoKClByaW50IGEgdGFibGUgc2hvd2luZyB0aGUgY291bnQgb2YgY2VsbHMgaW4gZWFjaCBpZGVudGl0eSBjYXRlZ29yeSBmcm9tIGVhY2ggcGxhdGUuCgpgYGB7cn0KdGFibGUoYXMuY2hhcmFjdGVyKHRpc3NAaWRlbnQpLCBhcy5jaGFyYWN0ZXIodGlzc0BtZXRhLmRhdGEkcGxhdGUuYmFyY29kZSkpCmBgYAoKCgojIFN1YnNldCBhbmQgaXRlcmF0ZQoKV2UgY2FuIHJlcGVhdCB0aGUgYWJvdmUgYW5hbHlzaXMgb24gYSBzdWJzZXQgb2YgY2VsbHMsIGRlZmluZWQgdXNpbmcgY2x1c3RlciBJRHMgb3Igc29tZSBvdGhlciBtZXRhZGF0YS4gVGhpcyBpcyBhIGdvb2Qgd2F5IHRvIGRyaWxsIGRvd24gYW5kIGZpbmQgc3Vic3RydWN0dXJlLgoKIyMgRmlyc3Qgc3Vic2V0CgpgYGB7cn0KIyBTdWJzZXQgZGF0YSBiYXNlZCBvbiBjbHVzdGVyIGlkCnN1YnRpc3MgPC0gU3Vic2V0RGF0YShvYmplY3QgPSB0aXNzLCBpZGVudC51c2UgPSBjKDcpLCBkby5jZW50ZXIgPSBGLCBkby5zY2FsZSA9IEYsIGNlbGxzLnVzZSA9ICkKCiMgVG8gc3Vic2V0IGRhdGEgYmFzZWQgb24gY2VsbF9vbnRvbG9neV9jbGFzcyBvciBvdGhlciBtZXRhZGF0YSwgeW91IGNhbiBleHBsaWNpdGx5IHBhc3MgY2VsbCBuYW1lcwoKIyBhbm5vID0gJ2V4b2NyaW5lIGNlbGxzJwojIGNlbGxzLnRvLnVzZSA9IHRpc3NAY2VsbC5uYW1lc1t3aGljaCh0aXNzQG1ldGEuZGF0YSRjZWxsX29udG9sb2d5X2NsYXNzID09IGFubm8pXQojIHN1YnRpc3MgPC0gU3Vic2V0RGF0YShvYmplY3QgPSB0aXNzLCBjZWxscy51c2UgPSBjZWxscy50by51c2UsIGRvLmNlbnRlciA9IEYsIGRvLnNjYWxlID0gRikKCmBgYAoKYGBge3J9CnN1YnRpc3MgPC0gTm9ybWFsaXplRGF0YShvYmplY3QgPSBzdWJ0aXNzKQpzdWJ0aXNzIDwtIFNjYWxlRGF0YShvYmplY3QgPSBzdWJ0aXNzLCB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJuUmVhZHMiLCAicGVyY2VudC5yaWJvIiwiUm40NXMiKSkKYGBgCgpgYGB7cn0Kc3VidGlzcyA8LSBGaW5kVmFyaWFibGVHZW5lcyhvYmplY3QgPSBzdWJ0aXNzLCBkby5wbG90ID0gVFJVRSwgeC5oaWdoLmN1dG9mZiA9IEluZiwgeS5jdXRvZmYgPSAwLjgpCnN1YnRpc3MgPC0gUnVuUENBKG9iamVjdCA9IHN1YnRpc3MsIHBjcy5jb21wdXRlID0gMjApCnN1YnRpc3MgPC0gUHJvamVjdFBDQShvYmplY3QgPSBzdWJ0aXNzLCBkby5wcmludCA9IEZBTFNFKQpgYGAKCgpSdW4gUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcy4KYGBge3J9CnN1YnRpc3MgPC0gUnVuUENBKG9iamVjdCA9IHN1YnRpc3MsIGRvLnByaW50ID0gRkFMU0UpCnN1YnRpc3MgPC0gUHJvamVjdFBDQShvYmplY3QgPSBzdWJ0aXNzLCBkby5wcmludCA9IEZBTFNFKQpgYGAKCmBgYHtyfQojIElmIHRoaXMgZmFpbHMgZm9yIHlvdXIgc3Vic2V0LCBpdCBtYXkgYmUgdGhhdCBjZWxscy51c2UgaXMgbW9yZSBjZWxscyB0aGFuIHlvdSBoYXZlIGxlZnQhIFRyeSByZWR1Y2luZyBpdC4KUENIZWF0bWFwKG9iamVjdCA9IHN1YnRpc3MsIHBjLnVzZSA9IDE6MywgY2VsbHMudXNlID0gMjUwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gMTIpCmBgYAoKTGF0ZXIgb24gKGluIEZpbmRDbHVzdGVycyBhbmQgVFNORSkgeW91IHdpbGwgcGljayBhIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yga2VlcGluZyB0aGUgbWFqb3IgZGlyZWN0aW9ucyBvZiB2YXJpYXRpb24gaW4gdGhlIGRhdGEgYW5kLCBpZGVhbGx5LCBzdXByZXNzaW5nIG5vaXNlLiBUaGVyZSBpcyBubyBjb3JyZWN0IGFuc3dlciB0byB0aGUgbnVtYmVyIHRvIHVzZSwgYnV0IGEgZGVjZW50IHJ1bGUgb2YgdGh1bWIgaXMgdG8gZ28gdW50aWwgdGhlIHBsb3QgcGxhdGVhdXMuCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gc3VidGlzcykKYGBgCgpDaG9vc2UgdGhlIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuCmBgYHtyfQojIFNldCBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMuIApzdWIubi5wY3MgPSA1CmBgYAoKClRoZSBjbHVzdGVyaW5nIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBhIG5lYXJlc3QgbmVpZ2hib3JzIGdyYXBoLiBDZWxscyB0aGF0IGhhdmUgc2ltaWxhciBleHByZXNzaW9uIHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyLiBUaGUgTG91dmFpbiBhbGdvcml0aG0gbG9va3MgZm9yIGdyb3VwcyBvZiBjZWxscyB3aXRoIGhpZ2ggbW9kdWxhcml0eS0tbW9yZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIGdyb3VwIHRoYW4gYmV0d2VlbiBncm91cHMuIFRoZSByZXNvbHV0aW9uIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBzY2FsZS4uLmhpZ2hlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBtb3JlIGNsdXN0ZXJzLCBsb3dlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBmZXdlci4KCmBgYHtyfQojIFNldCByZXNvbHV0aW9uIApzdWIucmVzLnVzZWQgPC0gMQoKc3VidGlzcyA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gc3VidGlzcywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOnN1Yi5uLnBjcywgCiAgICByZXNvbHV0aW9uID0gc3ViLnJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUpCmBgYAoKVG8gdmlzdWFsaXplIApgYGB7cn0KIyBJZiBjZWxscyBhcmUgdG9vIHNwcmVhZCBvdXQsIHlvdSBjYW4gcmFpc2UgdGhlIHBlcnBsZXhpdHkuIElmIHlvdSBoYXZlIGZldyBjZWxscywgdHJ5IGEgbG93ZXIgcGVycGxleGl0eSAoYnV0IG5ldmVyIGxlc3MgdGhhbiAxMCkuCnN1YnRpc3MgPC0gUnVuVFNORShvYmplY3QgPSBzdWJ0aXNzLCBkaW1zLnVzZSA9IDE6c3ViLm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTI1KQpgYGAKCmBgYHtyfQojIG5vdGUgdGhhdCB5b3UgY2FuIHNldCBkby5sYWJlbD1UIHRvIGhlbHAgbGFiZWwgaW5kaXZpZHVhbCBjbHVzdGVycwpUU05FUGxvdChvYmplY3QgPSBzdWJ0aXNzLCBkby5sYWJlbCA9IFQpCmBgYAoKYGBge3J9CnN1YnRpc3MubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhvYmplY3QgPSBzdWJ0aXNzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgpgYGB7cn0Kc3VidGlzcy5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24oNiwgYXZnX2RpZmYpCmBgYAoKQ2hlY2sgZXhwcmVzc2lvbiBvZiBnZW5lcyBvZiBpbnRlcnNldC4KYGBge3J9CmdlbmVzX3RvX2NoZWNrID0gYygnS2NuajgnLCdQb3N0bicsJ015aDExJywnQ25uMScpCgpGZWF0dXJlUGxvdChzdWJ0aXNzLCBnZW5lc190b19jaGVjaywgcHQuc2l6ZSA9IDEpCmBgYAoKRG90cGxvdHMgbGV0IHlvdSBzZWUgdGhlIGludGVuc2l0eSBvZiBleHBwcmVzc2lvbiBhbmQgdGhlIGZyYWN0aW9uIG9mIGNlbGxzIGV4cHJlc3NpbmcgZm9yIGVhY2ggb2YgeW91ciBnZW5lcyBvZiBpbnRlcmVzdC4KCmBgYHtyfQojIFRvIGNoYW5nZSB0aGUgeS1heGlzIHRvIHNob3cgcmF3IGNvdW50cywgYWRkIHVzZS5yYXcgPSBULgpEb3RQbG90KHN1YnRpc3MsIGdlbmVzX3RvX2NoZWNrLCBwbG90LmxlZ2VuZCA9IFQpCmBgYAoKSG93IGJpZyBhcmUgdGhlIGNsdXN0ZXJzPwpgYGB7cn0KdGFibGUoc3VidGlzc0BpZGVudCkKYGBgCgojIyBDaGVja2luZyBmb3IgYmF0Y2ggZWZmZWN0cwoKQ29sb3IgYnkgbWV0YWRhdGEsIGxpa2UgcGxhdGUgYmFyY29kZSwgdG8gY2hlY2sgZm9yIGJhdGNoIGVmZmVjdHMuCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzdWJ0aXNzLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJwbGF0ZS5iYXJjb2RlIikKYGBgCgpQcmludCBhIHRhYmxlIHNob3dpbmcgdGhlIGNvdW50IG9mIGNlbGxzIGluIGVhY2ggaWRlbnRpdHkgY2F0ZWdvcnkgZnJvbSBlYWNoIHBsYXRlLgoKYGBge3J9CnRhYmxlKGFzLmNoYXJhY3RlcihzdWJ0aXNzQGlkZW50KSwgYXMuY2hhcmFjdGVyKHN1YnRpc3NAbWV0YS5kYXRhJHBsYXRlLmJhcmNvZGUpKQpgYGAKCgoKIyMjIEFzc2lnbmluZyBzdWJjZWxsX29udG9sb2d5X2NsYXNzcwoKRm9yIHRoZSBzdWJzZXRzLCB3ZSBwcm9kdWNlIHN1YmNlbGxfb250b2xvZ3lfY2xhc3NzLiBUaGVzZSB3aWxsIGJlIHdyaXR0ZW4gYmFjayBhcyBtZXRhZGF0YSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0LCBzbyB3ZSBjYW4gc2VlIGFsbCBzdWJjZWxsX29udG9sb2d5X2NsYXNzcyB0b2dldGhlci4KCklmIHNvbWUgb2YgdGhlIGNsdXN0ZXJzIHlvdSBmaW5kIGluIHRoZSBzdWJzZXQgZGVzZXJ2ZSBhZGRpdGlvbmFsIGNlbGxfb250b2xvZ3lfY2xhc3MsIHlvdSBjYW4gYWRkIHRoYXQgcmlnaHQgaGVyZS4gVXNlIE5BIGZvciBjbHVzdGVycyBmb3Igd2hpY2ggbm8gc3ViY2VsbF9vbnRvbG9neV9jbGFzcyBpcyBuZWVkZWQuCgpgYGB7cn0Kc3ViY2x1c3Rlci5pZHMgPC0gYygwLCAxLCAyLCAzKQpzdWJmcmVlX2Fubm90YXRpb24gPC0gYygpCnN1YmNlbGxfb250b2xvZ3lfY2xhc3MgPC1jKCJNeW9maWJyb2JsYXN0IiwiTXlvZmlicm9ibGFzdCIsIk15b2ZpYnJvYmxhc3QiLCJTbW9vdGhfTXVzY2xlX0NlbGxzIikKCnN1YnRpc3NAbWV0YS5kYXRhWywnc3ViY2VsbF9vbnRvbG9neV9jbGFzcyddIDwtIHBseXI6Om1hcHZhbHVlcyh4ID0gc3VidGlzc0BpZGVudCwgZnJvbSA9IHN1YmNsdXN0ZXIuaWRzLCB0byA9IHN1YmNlbGxfb250b2xvZ3lfY2xhc3MpCgp0aXNzQG1ldGEuZGF0YVtzdWJ0aXNzQGNlbGwubmFtZXMsJ3N1YmNlbGxfb250b2xvZ3lfY2xhc3MnXSA8LSBhcy5jaGFyYWN0ZXIoc3VidGlzc0BtZXRhLmRhdGEkc3ViY2VsbF9vbnRvbG9neV9jbGFzcykKClRTTkVQbG90KG9iamVjdCA9IHN1YnRpc3MsIGRvLmxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnk9J3N1YmNlbGxfb250b2xvZ3lfY2xhc3MnKQpgYGAKCiMgU2F2ZSB0aGUgUm9iamVjdCBmb3IgbGF0ZXIKV2hlbiB5b3Ugc2F2ZSB0aGUgYW5ub3RhdGVkIHRpc3N1ZSwgcGxlYXNlIGdpdmUgaXQgYSBuYW1lLgoKYGBge3J9CmZpbGVuYW1lID0gaGVyZSgnMDBfZGF0YV9pbmdlc3QnLCAnMDRfdGlzc3VlX3JvYmpfZ2VuZXJhdGVkJywgCiAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZmFjcyIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9zZXVyYXRfdGlzcy5Sb2JqIikpCnByaW50KGZpbGVuYW1lKQpzYXZlKHRpc3MsIGZpbGU9ZmlsZW5hbWUpCmBgYAoKCiMgRXhwb3J0IHRoZSBmaW5hbCBtZXRhZGF0YQoKU28gdGhhdCBCaW9odWIgY2FuIGVhc2lseSBjb21iaW5lIGFsbCB5b3VyIGNlbGxfb250b2xvZ3lfY2xhc3NzLCBwbGVhc2UgZXhwb3J0IHRoZW0gYXMgYSBzaW1wbGUgY3N2LgoKYGBge3J9CmhlYWQodGlzc0BtZXRhLmRhdGEpCmBgYAoKCmBgYHtyfQpmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzAzX3Rpc3N1ZV9hbm5vdGF0aW9uX2NzdicsIAogICAgICAgICAgICAgICAgICAgICBwYXN0ZTAodGlzc3VlX29mX2ludGVyZXN0LCAiX2Fubm90YXRpb24uY3N2IikpCndyaXRlLmNzdih0aXNzQG1ldGEuZGF0YVssYygncGxhdGUuYmFyY29kZScsJ2NlbGxfb250b2xvZ3lfY2xhc3MnLCdjZWxsX29udG9sb2d5X2lkJyldLCBmaWxlPWZpbGVuYW1lKQpgYGAKCgoK